我有一个ASP.NET Web API Web服务,在某些情况下会抛出SerializationException。问题是我无法陷阱并记录服务器端的这个异常 - 它显示的唯一地方是在客户端的HTTP响应正文中。
我按照Exception Handling in ASP.NET Web API中的说明注册了ExceptionFilterAttribute
,并在我在控制器中抛出异常时验证它是否正常工作。不幸的是,在响应期间(控制器之后)抛出了SerializationException,并且似乎被ASP.NET完全吞没了。我也尝试在Global.asax.cs中挂钩Application_Error()
,但它也没有出现在那里。
如何在Web API响应期间捕获SerializationException异常?
答案 0 :(得分:9)
如果您使用ApiController.CreateResponse()
方法并返回HttpResponseMessage
而不是返回对象,则可以执行response.Content.LoadIntoBufferAsync().Wait()
,这会强制序列化在您还在的时候发生该行动因此可以捕捉异常。
答案 1 :(得分:2)
WebAPI Stack Poster:http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster-grayscale.pdf
那就是说,我无法想出一个直接的方法来实现这一目标。这很麻烦,但可以覆盖默认的Xml和Json格式化程序的WriteToStreamAsync方法和try-catch-log任何异常?
或者,您可以启用Web API跟踪,以记录序列化期间发生的异常。但是,如果您不知道导致序列化错误的请求,那么您可能希望始终启用跟踪,我不确定您可能想要做什么。
答案 2 :(得分:2)
您可以通过注册IExceptionHandler
的实现来捕获所有Web API异常。
请参阅Web API Global Error Handling
...异常过滤器无法处理的情况很多。例如:
- 从控制器构造函数抛出的异常。
- 从消息处理程序抛出的异常。
- 路由期间抛出的异常。
- 响应内容序列化期间抛出的异常。
该文章中未提及的一件事是您的IExceptionHandler
必须通过GlobalConfiguration.Configuration.Services.Add(...)
或通过配置为由DependencyResolver
使用的IoC容器进行注册。