2010-02-01 19 views

Antwort

23

ASP.NET-Webdienste werden nie ausgelöst Application_Error Ereignis und Ausnahmen können nicht global von ELMAH behandelt werden, wie in ASP.NET-Apps. Aber wir können "manuell" log Ausnahmen mit ELMAH:

 

public int WebServiceMethod() { 
    try { 
    ... 
    } 
    catch (Exception ex) { 
    Elmah.ErrorLog.GetDefault(
     HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current)); 
    } 
} 
 
+0

Das ist, was ich dachte, aber ich war zu überprüfen, ob es eine „sauberere“ Lösung. Danke –

+0

Ja, sauberere Lösung oder Übung wäre auch für mich interessant. Und das ist eine gute Frage (+1). –

+0

Ich habe endlich Ihre Lösung verwendet, ich habe keinen besseren Weg gefunden. Danke für den Tipp. –

23

Sie ein Soapextension verwenden können, dies zu tun: mit den folgenden Zeilen

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

Sie registrieren diese in der web.config:

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

Dadurch erhalten Sie Zugriff auf die Objekte HttpContext und SoapMessage, die Ihnen alle Details über das, was aufgerufen wurde, geben sollen. Ich denke, dass die Ausnahme, die Sie in diesem Stadium abrufen, immer eine SoapException sein wird und dass das Bit, an dem Sie interessiert sind, wahrscheinlich die innere Ausnahme ist.

+0

Danke, ich werde es versuchen. –

+1

hatte keine Chance, dies noch zu versuchen, aber es sieht so aus, als ob es funktionieren sollte. Wo "Ausnahme hier log" steht, erscheint der Code "Elmah.ErrorLog.GetDefault ( HttpContext.Current) .Log (new Elmah.Error (ex, HttpContext.Current));" könnte den Trick machen. – codeulike

+0

Es funktioniert tatsächlich. – avesse

0

können Sie diesen Code verwenden

try{ 
// your code in here 
} 
    catch (Exception ert) 
      { 
       Elmah.ErrorSignal.FromCurrentContext().Raise(ert); 

      }