我们使用优秀的ELMAH来处理ASP.NET 3.5 Web应用程序中的未处理异常.除了使用REST功能使用的WCF服务之外,这对于所有站点都非常有效.当应用程序代码未处理的操作方法中发生异常时,WCF会以各种方式处理它,具体取决于服务协定和配置设置.这意味着该异常不会最终触发ELMAH使用的ASP.NET HttpApplication.Error事件.我知道要处理的两个解决方案是:
第一个选项非常简单,但并不完全是DRY.第二个选项仅要求您在实现属性和ErrorHandler后使用自定义属性装饰每个服务.我是根据Will的工作完成的,但我想在发布代码之前验证这是正确的方法.
有没有更好的方法让我错过了?
在MSDN documenation为IErrorHandler说,的HandleError方法是做记录的地方,但ELMAH访问HttpContext.Current.ApplicationInstance,即使HttpContext.Current可用,在此方法中为null.在ProvideFault方法中调用Elmah是一种解决方法,因为ApplicationInstance已设置,但这与API文档中描述的意图不匹配.我在这里错过了什么吗?文档确实声明您不应该依赖于在操作线程上调用的HandleError方法,这可能是ApplicationInstance在此范围内为空的原因.
在服务器上,我正在抛出这样的异常.
catch(SqlException exception)
{
if (exception.Message.Contains("Custom error from stored proc"))
{
//Exception to be thrown when authentication fails.
throw new FaultException<MyServiceFault>(new MyServiceFault { MessageText = exception.Message });
}
}
Run Code Online (Sandbox Code Playgroud)
在客户端,我正在捕捉异常
catch(FaultException<MyServiceFault> faultException)
{
}
Run Code Online (Sandbox Code Playgroud)
这是我的MyServiceFault
[DataContract]
public class MyServiceFault
{
[DataMember]
public string MessageText { get; set; }
[DataMember]
public Guid Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是在客户端上,它不会转到MyServiceFault catch块而是转到通信异常catch块并抛出此错误
System.ServiceModel.CommunicationException: The underlying connection was closed: The connection was closed unexpectedly. ---> System.Net.WebException
Run Code Online (Sandbox Code Playgroud)
我还在我的服务[FaultContract(typeof(MyServiceFault))]实现的界面中修改了我的服务方法.
在我的web.config servicebehaviour标签组成
<serviceDebug includeExceptionDetailInFaults="true" /> …