如何在Web API中捕获SerializationException?

时间:2013-05-14 20:57:16

标签: asp.net serialization exception-handling asp.net-web-api

我有一个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异常?

3 个答案:

答案 0 :(得分:9)

如果您使用ApiController.CreateResponse()方法并返回HttpResponseMessage而不是返回对象,则可以执行response.Content.LoadIntoBufferAsync().Wait(),这会强制序列化在您还在的时候发生该行动因此可以捕捉异常。

答案 1 :(得分:2)

BTW,响应的序列化实际上发生在主机层(在HttpControllerHandler中,当托管在IIS和HttpSelfhostServer中,当托管在SelfHost中时)在堆栈下面而不是在从动作返回响应之后立即发生。 / p>

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容器进行注册。