2016-10-05 33 views
1

MVC 5アプリケーションの未処理例外では、グローバルApplication_Errorイベント内のキャプチャが行われ、ErrorControllerにリダイレクトされました。MVC 6のグローバルエラー処理

最後のエラーは、Global.ErrorイベントのHttpApplicationStateに追加され、コントローラで取得されます。

MVC 6にはグローバルファイルがありません。未処理の例外をキャプチャするのにIExceptionFilterを使用します。

public class GlobalExceptionFilter : IExceptionFilter, IDisposable { 

    private readonly ILogger logger; 
    private bool _disposed; 

    public GlobalExceptionFilter(ILoggerFactory logger) { 
     if (logger == null) { 
      throw new ArgumentNullException(nameof(logger)); 
     } 
     this.logger = logger.CreateLogger("Global Exception Filter"); 
    } 

    public void OnException(ExceptionContext context) { 
     logger.LogError("GlobalExceptionFilter", context.Exception); 
     //redirect to controller 
    } 

    public void Dispose() { 
     if (this._disposed) { 
      return; 
     } 
     this._disposed = true; 
    } 

    private static int GetHttpStatusCode(Exception ex) { 
     if (ex is HttpResponseException) { 
      return (int)(ex as HttpResponseException).HttpStatusCode; 
     } 
     return (int)HttpStatusCode.InternalServerError; 
    } 

} 

OnExceptionでも同じことができますか? asp.netコアドキュメントから

+4

[例外ログミドルウェアを作成する](http://stackoverflow.com/a/36922701/4270650)代わりに、組み込みの 'IApplicationBuilder.UseExceptionHandler'を使ってリダイレクトを処理します。ミドルウェアについての1つの良い点は、それがまた、かみそりのエラーをキャッチすることです。 –

+0

http://stackoverflow.com/questions/28967183/global-error-logging-in-asp-net-mvc-6 –

答えて

1

一般に

を(hereをチェック)、フィルターを横断業務と アプリケーションの問題を扱うことを意味します。これは、しばしばミドルウェアの場合と同じです。 フィルタは機能のミドルウェアと非常によく似ていますが、 の動作をスコープして、ビューの前やモデルバインディングの後など、 が意味を持つアプリ内の場所に挿入します。フィルタ は、MVCの一部であり、コンテキストと構造にアクセスできます。 インスタンスの場合、ミドルウェアは リクエストでモデル検証がエラーを生成したかどうかを簡単に検出できないため、それに応じて応答しますが、フィルタ は簡単に実行できます。

このドキュメントの説明に基づいています。ミドルウェアアプローチとフィルタアプローチの両方が要件を満たします。 MVCパイプラインの詳細とエラー情報が必要な場合は、フィルタアプローチを使用する必要があります。

関連する問題