12

我有一个 ASP.NET Web API Web 服务,它在某些情况下会引发 SerializationException。问题是我无法在服务器端捕获和记录此异常——它显示的唯一位置是对客户端的 HTTP 响应正文。

我按照 ASP.NET Web APIExceptionFilterAttribute中的异常处理中的描述注册了一个,并验证了当我在控制器中引发异常时它可以正常工作。不幸的是,在响应期间(在控制器之后)抛出了 SerializationException,并且似乎被 ASP.NET 完全吞没了。我也尝试在 Global.asax.cs 中挂接,但它也没有出现在那里。Application_Error()

如何在 Web API 响应期间捕获 SerializationException 异常?

4

3 回答 3

9

如果您使用该方法而不是返回一个对象,而是使用该ApiController.CreateResponse()方法并返回HttpResponseMessage您可以执行的操作response.Content.LoadIntoBufferAsync().Wait(),这将强制序列化在您仍在操作中时发生,因此可以捕获异常。

于 2013-05-15T00:37:29.283 回答
2

顺便说一句,响应的序列化实际上发生在主机层(在 HttpControllerHandler 中,当托管在 IIS 和 HttpSelfhostServer 中,当托管在 SelfHost 中时),它位于堆栈下方,而不是在从操作返回响应之后立即发生。

WebAPI 堆栈海报:http ://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster-grayscale.pdf

也就是说,我无法想出一个直接的方法来实现这一点。这很麻烦,但可能会覆盖默认的 Xml 和 Json 格式化程序的 WriteToStreamAsync 方法和 try-catch-log 任何异常?

或者,您可以启用 Web API 跟踪,这将记录序列化期间发生的异常。但是,是的,如果您不知道导致序列化错误的请求,那么您可能希望始终启用跟踪,我不确定您可能想要做的事情。

于 2013-05-14T21:14:35.683 回答
2

您可以通过注册IExceptionHandler.

请参阅Web API 全局错误处理

...有许多异常过滤器无法处理的情况。例如:

  • 控制器构造函数抛出的异常。
  • 消息处理程序抛出的异常。
  • 路由期间抛出的异常。
  • 响应内容序列化期间抛出的异常。

那篇文章中没有提到的一件事是,您IExceptionHandler必须通过GlobalConfiguration.Configuration.Services.Add(...)或通过配置为由DependencyResolver.

于 2014-03-04T06:41:30.700 回答