2010-02-01 14 views

Respuesta

23

Los servicios web de ASP.NET nunca disparan Application_Error el evento y las excepciones no pueden ser manejadas globalmente por ELMAH como en las aplicaciones de ASP.NET. Pero podemos "manualmente" log excepciones usando ELMAH:

 

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

Eso es lo que pensaba, pero me iba a registrar si había una solución "más limpia". Gracias –

+0

Sí, la solución más limpia o práctica sería interesante para mí también. Y esta es una buena pregunta (+1). –

+0

Finalmente utilicé su solución, no encontré una mejor manera de hacerlo. Gracias por la pista. –

23

Se puede utilizar un SoapExtension para hacer esto:

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

se ha registrado esta en el web.config con las siguientes líneas:

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

Esto le dará acceso a los objetos HttpContext y SoapMessage que le proporcionarán todos los detalles que necesita sobre lo que se está llamando. Creo que la excepción que recuperas en esta etapa siempre será SoapException y que el bit en el que estás interesado probablemente sea la excepción interna.

+0

Gracias, lo intentaré. –

+1

no han tenido la oportunidad de probar esto todavía, pero parece que debería funcionar. Donde dice 'excepción de registro aquí', el código 'Elmah.ErrorLog.GetDefault ( HttpContext.Current) .Log (nuevo Elmah.Error (por ejemplo, HttpContext.Current)); 'podría hacer el truco. – codeulike

+0

Funciona, de hecho. – avesse

0

Usted puede utilizar este código

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

      } 
Cuestiones relacionadas