为什么global.asax Application_Error方法不能捕获ASMX服务抛出的exception?

以及如何解决它。 为了维护目的,我想logging每个抛出的exception。

这是.NET中的一个已知问题 – Application_Error永远不会为Web服务触发。 不知道是否有任何理由是由devise,但它不工作。

杰夫·阿特伍德(Jeff Atwood)在几年前就此发表了一篇文章 (以及后续的文章 ),主要内容如下:

  • 在每个Web服务方法周围放一个try-catch块
  • 使用外观devise模式,并将try-catch包含在父对象中
  • 编写一个自定义的SOAP扩展或HTTPModule

我唯一关心的是第一个,虽然看起来很多工作。

更好: HttpApplication.Error事件 :

注意:

如果您的Web应用程序包含XML Web服务,则不能使用Error事件处理这些服务的全局exception。 XML Web服务的HTTP处理程序消耗XML Web服务中发生的任何exception,并在调用错误之前将其转换为SOAP错误。 要处理XML Web服务exception,请构build一个SOAP扩展来处理自定义全局exception处理程序中的Web服务exception。 有关更多信息,请参阅处理和抛出XML Web服务中的exception 。

对于任何想在这个主题上看到微软话的人,请看这里:“ 在XML Web服务中处理和抛出exception ”。

这是相关部分:

Web应用程序可以由多个XML Web服务组成,但Global.asax文件中的Application_Error事件不能用于全局exception处理。 用于XML Web服务的HttpHandler将消耗在执行XML Web服务时发生的任何exception,并在调用Application_Error事件之前将其变为SOAP错误。

Application_error在默认情况下不适用于iis 7。