Yuvalの答えは、リンクpageに記載されているように、Web APIで捕捉された未処理の例外に対する応答をカスタマイズするためのものです。詳細については、ページの「いつ使用する」セクションを参照してください。ロガーは常に呼び出されますが、応答を送信できるときだけハンドラーが呼び出されます。つまり、ログにはloggerを使用し、応答をカスタマイズするにはハンドラを使用します。
ところで、私はアセンブリv5.2.3を使用しており、ExceptionHandler
クラスはHandleCore
メソッドを持っていません。これと同等のものはHandle
だと思います。しかし、単純にサブクラス化するExceptionHandler
(Yuvalの回答のように)は機能しません。私の場合は、IExceptionHandler
を次のように実装する必要があります。
internal class OopsExceptionHandler : IExceptionHandler
{
private readonly IExceptionHandler _innerHandler;
public OopsExceptionHandler (IExceptionHandler innerHandler)
{
if (innerHandler == null)
throw new ArgumentNullException(nameof(innerHandler));
_innerHandler = innerHandler;
}
public IExceptionHandler InnerHandler
{
get { return _innerHandler; }
}
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
Handle(context);
return Task.FromResult<object>(null);
}
public void Handle(ExceptionHandlerContext context)
{
// Create your own custom result here...
// In dev, you might want to null out the result
// to display the YSOD.
// context.Result = null;
context.Result = new InternalServerErrorResult(context.Request);
}
}
ロガーとは異なり、追加しないでデフォルトのハンドラを置き換えることによってハンドラを登録することに注意してください。
config.Services.Replace(typeof(IExceptionHandler),
new OopsExceptionHandler(config.Services.GetExceptionHandler()));
[ASP.NET Health Monitoring](http://msdn.microsoft.com/en-us/library/bb398933.aspx)を使用してみましたか?それを有効にして、例外がイベントログに記録されていないかどうかを確認してください。 –
ヘルスモニタリングはMVCパイプライン例外をキャッチしますが、Web APIのパイプライン例外は検出されません。 –
ありがとう - WebAPIのログ記録が既にソートされていると思ったところで、コンストラクタ/依存性注入の問題をログに記録できない理由を理解するのにしばらく時間がかかりました... – Overflew