Yuval的答案是自定义对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()));