原文:在ASP.NET中使用SOAP Extensions捕获WebService异常
Application_Error不能捕获的异常
[WebMethod] public string HelloWorld() { throw new Exception("this exption can't be handled by Application_Error Method"); return "Hello World"; }
定义Application_Error将不能捕获这个异常.
原因需要了解一下SOAP请求的在ASP.NET的生命周期.
Process Message过程调用WebMethod时如果产生SoapException,SoapHeaderException 被序列化后,返回在SOAP <Fault>结点.
使用SOAP extension扩展处理Process Message过程产生的异常
我们可以SOAP Extension处理
Code
public class SoapExceptionHandler : System.Web.Services.Protocols.SoapExtension
{
public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterSerialize)
{
if (message.Exception != null)
{
LogUtil.Log.Error(message.Exception.InnerException);
}
}
}
public override object GetInitializer(Type serviceType)
{
return null;
}
public override object GetInitializer(
LogicalMethodInfo methodInfo,
SoapExtensionAttribute attribute)
{
return null;
}
public override void Initialize(object initializer)
{
}
}
在Web.config system.web结点中配置
Code
<webServices>
<soapExtensionTypes>
<add type="Elplan.App.SoapExceptionHandler, Elplan.App" priority="1" group="High" />
</soapExtensionTypes>
</webServices>
调试:
如果使用VS直接运行调试asmx,是不可以的.(因为...它不是一个完整的SOAP请求.)可使用WebServiceStudio.
相关地址:http://www.codeplex.com/WebserviceStudio
参考文章:
Using SOAP Extensions in ASP.NET
Handling and Throwing Exceptions in XML Web Services
How to create a global exception handler for a Web Service