为什么永远不会调用自定义ExceptionHandler,而是返回标准响应(不是我想要的响应)?

像这样注册

config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());

并像这样实现
public class GlobalExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        context.Result = new ExceptionResponse
        {
            statusCode = context.Exception is SecurityException ? HttpStatusCode.Unauthorized : HttpStatusCode.InternalServerError,
            message = "An internal exception occurred. We'll take care of it.",
            request = context.Request
        };
    }
}

public class ExceptionResponse : IHttpActionResult
{
    public HttpStatusCode statusCode { get; set; }
    public string message { get; set; }
    public HttpRequestMessage request { get; set; }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage(statusCode);
        response.RequestMessage = request;
        response.Content = new StringContent(message);
        return Task.FromResult(response);
    }
}

然后像这样扔(测试)
throw new NullReferenceException("testerror");

在 Controller 或存储库中。

更新

我没有另一个ExceptionFilter

我发现了此行为的触发器:

给定的URL
GET http://localhost:XXXXX/template/lock/someId

发送此 header ,我的ExceptionHandler有效
Host: localhost:XXXXX

发送此 header ,它将无法正常运行,而内置处理程序将返回错误
Host: localhost:XXXXX
Origin: http://localhost:YYYY

这可能是CORS请求的问题(我将WebAPI CORS包全局使用通配符),或者最终是我的ELMAH记录器。尽管内置的错误处理程序有所不同,但当托管在Azure(网站)上时,也会发生这种情况。

任何想法如何解决这个问题?

最佳答案

事实证明,默认值仅处理最外部的异常,而不处理存储库类中的异常。因此,下面的内容也必须被覆盖:

public virtual bool ShouldHandle(ExceptionHandlerContext context)
{
    return context.ExceptionContext.IsOutermostCatchBlock;
}

更新1

WebAPI v2不再使用IsOutermostCatchBlock。无论如何,我的实现没有任何变化,因为ShouldHandle中的新代码仍然阻止了我的错误处理程序。所以我正在使用它,并且我的错误处理程序被调用了一次。我以这种方式捕获 Controller 和存储库中的错误。
public virtual bool ShouldHandle(ExceptionHandlerContext context)
{
    return true;
}

更新2

由于这个问题受到了广泛关注,因此请注意,当前解决方案是@JustAMartin在下面的评论中使用的linked

关于c# - 未调用WebApi v2 ExceptionHandler,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22169889/

10-15 02:37