我有一个在某些情况下抛出SerializationException的ASP.NET Web API web服务。问题是我无法在服务器端捕获和记录这个异常--它唯一出现的地方是客户端的HTTP响应的主体中。
我按照Exception Handling in ASP.NET Web API中的描述注册了一个ExceptionFilterAttribute,并验证了当我在控制器中抛出异常时,它是否工作正常。不幸的是,SerializationException在响应过程中被抛出了(在控制器之后),似乎完全被ASP.NET吞没了。我也试过在Global.asax.cs中挂钩Application_Error(),但它也没有出现在那里。
如何在Web API响应期间捕获SerializationException异常?
发布于 2013-05-15 08:37:29
如果不是返回一个对象,而是使用ApiController.CreateResponse()方法并返回一个HttpResponseMessage,那么您可以执行response.Content.LoadIntoBufferAsync().Wait(),这将强制序列化在您仍在操作中时发生,因此可以捕获异常。
发布于 2013-05-15 05:14:36
顺便说一句,响应的序列化实际上发生在主机层(在HttpControllerHandler中,当托管在IIS中时,在HttpSelfhostServer中,当托管在SelfHost中时),它位于堆栈的下方,而不是在响应从操作返回之后立即发生。
WebAPI Stack发信人:http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster-grayscale.pdf
这就是说,我不能想出一个直接的方法来实现这一点。这很麻烦,但可能会覆盖默认Xml和Json格式化程序的WriteToStreamAsync方法,并尝试捕获记录任何异常?
或者,您可以启用Web API跟踪,这将记录序列化过程中发生的异常。但是,如果您不知道导致序列化错误的请求,那么您可能希望始终启用跟踪,我不确定您是否想要这样做。
发布于 2014-03-04 14:41:31
您可以通过注册IExceptionHandler的实现来捕获所有Web API异常。
请参阅Web API Global Error Handling
...there是许多异常过滤器无法处理的情况。例如:
从控制器constructors.
在那篇文章中没有提到的一件事是,您的IExceptionHandler必须通过GlobalConfiguration.Configuration.Services.Add(...)或通过配置为供DependencyResolver使用的IoC容器进行注册。
https://stackoverflow.com/questions/16552715
复制相似问题