Yuvalの答えは、リンクされたページに記載されているように、ログのためではなく、Web APIによってキャッチされた未処理の例外への応答をカスタマイズするためのものです。詳細については、ページの「使用する場合」セクションを参照してください。ロガーは常に呼び出されますが、ハンドラーは、応答を送信できる場合にのみ呼び出されます。つまり、ロガーを使用してログを記録し、ハンドラーを使用して応答をカスタマイズします。
ちなみに、私はアセンブリ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()));