2016-05-19 1 views
1

は、私は私のオブジェクトを検証していますし、それが失敗した場合、それは(FluentValidationを使用して)にValidationExceptionをスローし、このターン中、エラーコード500リターンの検証エラー私のサービスコードで

と例外がスローされます

私のすべてのメソッドを実行してtry..catchを追加することなく、ValidationExceptionがスローされたかどうかを確認するmvcパイプラインに何かを追加することは可能ですか?そうであればValidationExceptionのMessageでBadRequestを返しますか?

私はすべての私のメソッドを更新した場合、それはお勧め、このことは可能ですか、私は上記のようにすべての私のメソッドを更新する必要があり、この

try 
{ 
    await _service.AddAsync(entity); 

    // return created response 
    return Created(_httpContextAccessor.HttpContext.Request.GetDisplayUrl(), _mapper.Map<DatasheetModel>(entity)); 
} 
catch (ValidationException e) 
{ 
    return BadRequest(e.Message); 
} 

ようになるでしょうか?

+0

@David - その質問は、ASP.NETコアであるWeb API 2を参照しています。この質問はASP.NET CoreであるMVC 6を参照しています。したがって、2つは完全に無関係です。 –

+0

@David - ASP.NET CoreはASP.NETの完全な書き換えであり、System.Web.dllを削除します。 ASP.NETコアより前のものはすべてSystem.Web.dllに基づいているため、同じ方法の近くでは動作しません。 –

+0

例外処理のためのミドルウェアの考え方は同じです。期間http://stackoverflow.com/a/34312016/2410379 –

答えて

0

どこにでもtry/catchを置く必要はありません。例外処理ミドルウェアを作成し、それをHttpパイプラインに挿入することができます。ミドルウェアは、ASP.NET Coreの主な概念の1つです。 3つの簡単なステップでミドルウェアを作成する方法を示すGitHubにRC1プロジェクトが掲載されています。あなたはhereをダウンロードできます。 ReadMeファイルは、コードの関連する領域を検索する方法を説明します。

カスタム例外ハンドラミドルウェアを開発する方法を示すプロジェクトも公開しました。そのプロジェクトhereをダウンロードできます。また、ReadMeファイルは、コードの関連する領域のプロジェクトを検索する方法を説明します。

0

ASP.NETコアは、ミドルウェアの概念を次のレベルに引き上げたということです。これは、単にcustom middlewareを作成して実装することによって、あなたが望むように達成できます。ミドルウェアはすべてのリクエストと対応するレスポンスを確認して対応できます。

public class ValidationExceptionMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public ValidationExceptionMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     // Handle exceptions and propagate appropriate response 
     await _next.Invoke(context); 
    } 
} 

あなたのミドルウェアはStartup.Configure方法でそれを追加執筆したら:

public void Configure(IApplicationBuilder app, 
         IHostingEnvironment env, 
         ILoggerFactory loggerFactory) 
{ 
    // Omitted for brevity... 
    app.UseMiddleware<ValidationExceptionMiddleware>(); 
} 

は例外フィルタもありますが、それはあなたが要求と応答パイプラインと対話することはできません。