在常规的ASP.NET Web Service (asmx)中是否有像在ASP.NET网站中使用ELMAH一样全局处理异常的方法?
在常规的ASP.NET Web Service (asmx)中是否有像在ASP.NET网站中使用ELMAH一样全局处理异常的方法?
ASP.NET Web服务不会触发 Application_Error
事件,也不能像在ASP.NET应用程序中那样全局处理异常。但我们可以使用ELMAH "手动"记录异常:
public int WebServiceMethod() {
try {
...
}
catch (Exception ex) {
Elmah.ErrorLog.GetDefault(
HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
}
}
using System;
using System.Web.Services.Protocols;
namespace MyNamespace
{
class ELMAHExtension : SoapExtension
{
public override object GetInitializer(Type serviceType)
{ return null; }
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{ return null; }
public override void Initialize(object initializer)
{ }
public override void ProcessMessage(SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterSerialize &&
message.Exception != null)
{
// Log exception here
}
}
}
}
你可以通过以下代码在web.config文件中注册它:
<system.web>
<webServices>
<soapExtensionTypes>
<add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" />
</soapExtensionTypes>
</webServices>
</system.web>
这将为您提供访问HttpContext和SoapMessage对象的权限,这些对象应该为您提供有关所调用内容的所有细节。我认为您在此阶段检索到的异常始终将是SoapException,并且您感兴趣的部分可能是内部异常。
Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
可能会解决问题。 - codeulikeProcessMessage
函数中使其工作:
Elmah.ErrorSignal.FromCurrentContext().Raise(message.Exception);
但请记住,在使用asmx服务的默认测试接口(带有调用按钮的接口)时,它不起作用。我在某个地方读到过,原因是该接口使用HTTP而不是SOAP,因此当从接口调用方法时,soapExtensions未加载。但我不是很确定。 - emregon你可以使用这段代码
try{
// your code in here
}
catch (Exception ert)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ert);
}