【发布时间】:2010-10-28 02:38:23
【问题描述】:
我们正在使用出色的ELMAH 来处理 ASP.NET 3.5 Web 应用程序中未处理的异常。除了使用 REST 功能使用的 WCF 服务之外,这对于所有站点都非常有效。当应用程序代码未处理的操作方法中发生异常时,WCF 会根据服务协定和配置设置以各种方式处理它。这意味着异常不会最终触发 ELMAH 使用的 ASP.NET HttpApplication.Error 事件。我知道的两种解决方案是:
- 将所有方法调用包装在一个 try { } catch(Exception ex) { Elmah.ErrorSignal.FromCurrentContext().Raise(ex);扔; } 在 catch 块中显式调用 Elmah。
- 如Will Hughes' 博文Making WCF and ELMAH play nice together 中所述,使用IErrorHandler 将对ELMAH 的调用分解为单独的ErrorHandler。
第一个选项非常简单,但不完全是DRY。第二个选项只需要您在实现属性和 ErrorHandler 之后使用自定义属性来装饰每个服务。我已经根据Will's 的工作完成了这项工作,但我想在发布代码之前验证这是正确的方法。
我错过了更好的方法吗?
IErrorHandler 的 MSDN 文档说 HandleError 方法是进行日志记录的地方,但 ELMAH 访问的是 HttpContext.Current.ApplicationInstance,即即使 HttpContext.Current 可用,此方法中的 null 也是如此。在 ProvideFault 方法中调用 Elmah 是一种解决方法,因为 ApplicationInstance 已设置,但这与 API 文档中描述的意图不符。 我在这里遗漏了什么吗?文档确实声明您不应依赖在操作线程上调用的 HandleError 方法,这可能是 ApplicationInstance 在此范围内为 null 的原因。
【问题讨论】:
标签: asp.net wcf exception logging elmah