首先,是的,我们已经创建并正在使用一个继承自 ExceptionFilterAttribute 的异常过滤器。它会在应用程序启动时在我们的身份过滤器之后立即注册到配置中,并且如果我们的 API 内部某个地方发生错误,它的工作效果几乎与预期一致。
话虽这么说,我正在寻找一种方法来处理在到达 API 之前发生的错误。
推理:我们不想返回 YSOD 和/或 IIS HTML 错误。我们总是希望使用自定义异常过滤器/处理程序,以便我们可以正确处理日志记录并向用户返回 JSON 响应。
截至目前,使用 Fiddler 发出请求,我可以附加到 w3wp.exe 进程,并看到请求命中了 global.asax 中的 Application_BeginRequest 方法。之后,它只返回 500 响应。它永远不会因异常而中断代码,也不会在此之后遇到我的任何断点。它似乎返回了 IIS 错误。我们绝不希望这种情况发生。我们需要能够捕获所有这些“低级”异常、记录它们并向用户返回有意义的内容。
我们可以采取一些措施来处理之前出现的 ASP.NET MVC Web API 代码中的错误吗?
尽管我喜欢 Darin 的答案,但它在我们的情况下不起作用,因为 ASP.NET MVC Web API 框架在内部抑制/处理异常,并且不会重新抛出以命中 Global.asax 中的 Application_Error 方法。我们的解决方案是这样的。
我最终创建了一个自定义 DelegatingHandler,如下所示:
public class PrincipalHandler : DelegatingHandler
{
protected const string PrincipalKey = "MS_UserPrincipal";
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
setAnonymousPrincipal();
request = InitializeIdentity(request);
return base.SendAsync(request, cancellationToken)
.ContinueWith(r =>
{
// inspect result for status code and handle accordingly
return r.Result;
});
}
}
然后,我将其插入到 HttpConfiguration 中,以确保它是第一个/最后一个被命中的处理程序。处理程序在 Web API 中的工作方式是分层的。因此,每个请求要命中的第一个处理程序将是响应中要命中的最后一个处理程序。至少这是我的理解,如果我错了,请随时纠正我。
public static void ConfigureApis(HttpConfiguration config)
{
config.MessageHandlers.Insert(0, new PrincipalHandler());
}
通过使用这种方法,我们现在可以检查从 Web API 和控制器返回的任何响应中的每个结果。这使我们能够处理由于某些内容未按预期返回而可能需要发生的任何日志记录。现在,我们还可以更改返回的响应内容,以便 IIS 在看到某些 HTTP 状态代码时不会插入任何默认的 HTML 错误页面。
我遇到的唯一问题是,他们不会在从 base.SendAsync() 返回的任务上发送异常,我希望他们在即将发布的 Web API 中对此进行更改。所以我们唯一需要参考的信息就是HTTP状态码,并尽力给消费者一个合理的或可能的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)