1. ホーム
  2. c#

[解決済み] ASP.NET Web Apiで処理されない例外をすべてキャッチする

2022-08-02 07:31:31

質問

どのようにすれば をすべて をキャッチし、ログを取ることができますか?

今のところ、私は試してみました。

  • を作成し、登録します。 ExceptionHandlingAttribute
  • を実装します。 Application_Error メソッドを Global.asax.cs
  • にサブスクライブする AppDomain.CurrentDomain.UnhandledException
  • 登録先 TaskScheduler.UnobservedTaskException

ExceptionHandlingAttribute は、コントローラのアクションメソッドやアクションフィルタ内でスローされる例外を正常に処理しますが、それ以外の例外は処理されないなどの問題があります。

  • を実行した際にスローされる例外。 IQueryable の実行に失敗したときにスローされる例外です。
  • メッセージハンドラによって投げられた例外 (すなわち HttpConfiguration.MessageHandlers )
  • コントローラのインスタンスを作成する際に発生する例外

基本的に、例外によってクライアントに500 Internal Server Errorが返されるようであれば、それをログに記録してほしいのです。実装方法 Application_Error を実装することで、Web FormsとMVCでこの仕事をうまくこなせました。Web Apiでは何を使えばいいのでしょうか?

どのように解決するのですか?

これは、WebAPI 2.1 で可能になりました ( 新機能 ):

IExceptionLogger の実装を一つ以上作成します。例えば

public class TraceExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Trace.TraceError(context.ExceptionContext.Exception.ToString());
    }
}

そして、アプリケーションのHttpConfigurationに登録し、configコールバックの中で以下のように記述します。

config.Services.Add(typeof(IExceptionLogger), new TraceExceptionLogger());

または直接

GlobalConfiguration.Configuration.Services.Add(typeof(IExceptionLogger), new TraceExceptionLogger());