为啥 global.asax Application_Error 方法不能捕获 ASMX 服务抛出的异常?

Posted

技术标签:

【中文标题】为啥 global.asax Application_Error 方法不能捕获 ASMX 服务抛出的异常?【英文标题】:Why global.asax Application_Error method does not catch exceptions thrown by ASMX service?为什么 global.asax Application_Error 方法不能捕获 ASMX 服务抛出的异常? 【发布时间】:2010-09-17 17:06:51 【问题描述】:

以及如何解决它。我想记录每个抛出的异常以进行维护。

【问题讨论】:

【参考方案1】:

这是 .Net 中的一个已知问题 - Web 服务永远不会触发 Application_Error。不确定是否有任何原因是设计使然,但它就是行不通。

几年前,Jeff Atwood 有一个post(和follow-up)关于这个问题,有以下想法:

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

我唯一关心的是第一个,尽管这似乎需要很多工作。

【讨论】:

【参考方案2】:

如果您想了解 Microsoft 对此主题的看法,请参阅此处:“Handling and Throwing Exceptions in XML Web Services”。

这是相关部分:

一个 Web 应用程序可以由多个 XML Web services 组成,但是 Global.asax 文件中的 Application_Error 事件不能用于全局异常处理。 XML Web services 的 HttpHandler 处理 XML Web services 执行时发生的任何异常,并在调用 Application_Error 事件之前将其转换为 SOAP 错误。

【讨论】:

【参考方案3】:

更好:HttpApplication.Error event:

注意:

如果您的 Web 应用程序包含 XML Web 服务,您不能使用错误 全局异常处理事件 那些服务。 HTTP 处理程序 XML Web services 使用任何 XML Web 中发生的异常 服务并将其转换为 SOAP 在调用错误之前发生故障。 要处理 XML Web 服务异常, 构建一个 SOAP 扩展来处理 Web 自定义全局中的服务异常 异常处理程序。更多 信息,请参阅Handling and Throwing Exceptions in XML Web Services。

【讨论】:

以上是关于为啥 global.asax Application_Error 方法不能捕获 ASMX 服务抛出的异常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AppDomain.CurrentDomain.GetAssemblies() 在某些情况下不返回 Global.asax 中的依赖程序集?

为啥 global.asax Application_Error 方法不能捕获 ASMX 服务抛出的异常?

Global.asax

ASP.NET MVC中的Global.asax文件

使用 global.asax 都有哪些替代方法?

Global.asax调试