Handle exceptions in web services with Elmah

后端 未结 3 610
[愿得一人]
[愿得一人] 2020-12-09 08:05

Is there a way to globally handle exceptions in regular ASP.NET Web Service (asmx) using ELMAH like we do it in ASP.NET web site ?

相关标签:
3条回答
  • 2020-12-09 08:19

    ASP.NET web services never fire Application_Error event and exceptions cannot be handled globally by ELMAH like in ASP.NET apps. But we can "manually" log exceptions using ELMAH:

    
    public int WebServiceMethod() {
      try {
       ...
      }
      catch (Exception ex) {
        Elmah.ErrorLog.GetDefault(
          HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
      }
    }
    
    
    0 讨论(0)
  • 2020-12-09 08:31

    You can use a SoapExtension to do this :

    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
                }
            }
        }
    }
    

    You register this in the web.config with the following lines :

    <system.web>
      <webServices>
        <soapExtensionTypes>
          <add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" />
        </soapExtensionTypes>
      </webServices>
    </system.web>
    

    This will give you access to the HttpContext and SoapMessage objects which should give you all of the details you need about what was being called. I think the exception you retrieve at this stage will always be a SoapException and that the bit you are interested in is probably the inner exception.

    0 讨论(0)
  • 2020-12-09 08:37

    You can use this code

     try{
    // your code in here
    }
         catch (Exception ert)
                {
                    Elmah.ErrorSignal.FromCurrentContext().Raise(ert);
    
                }
    
    0 讨论(0)
提交回复
热议问题