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