script net mvc example asp asp.net web-services asmx elmah

asp.net - net - elmah github



Manejar excepciones en servicios web con Elmah (3)

¿Hay alguna manera de manejar globalmente excepciones en el servicio web ASP.NET regular (asmx) usando ELMAH como lo hacemos en el sitio web ASP.NET?


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

Usted registra esto 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.


Puedes usar este código

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


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

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