jar*_*ryd 11 .net asp.net-mvc iis-7 asp.net-web-api
我将开始,是的,我们已经创建并使用从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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我将其插入到 HttpConfiguration 中,以确保它是第一个/最后一个被命中的处理程序。处理程序在 Web API 中的工作方式是分层的。因此,每个请求要命中的第一个处理程序将是响应中要命中的最后一个处理程序。至少这是我的理解,如果我错了,请随时纠正我。
public static void ConfigureApis(HttpConfiguration config)
{
config.MessageHandlers.Insert(0, new PrincipalHandler());
}
Run Code Online (Sandbox Code Playgroud)
通过使用这种方法,我们现在可以检查从 Web API 和控制器返回的任何响应中的每个结果。这使我们能够处理由于某些内容未按预期返回而可能需要发生的任何日志记录。现在,我们还可以更改返回的响应内容,以便 IIS 在看到某些 HTTP 状态代码时不会插入任何默认的 HTML 错误页面。
我遇到的唯一问题是,他们不会在从 base.SendAsync() 返回的任务上发送异常,我希望他们在即将发布的 Web API 中对此进行更改。所以我们唯一需要参考的信息就是HTTP状态码,并尽力给消费者一个合理的或可能的答案。
归档时间: |
|
查看次数: |
5686 次 |
最近记录: |