Manejo y captura de excepciones en Servicios Web sobre ASP .NET y C#

Si desarrollas aplicaciones en ASP.NET, puedes utilizar de una manera muy sencilla el evento Application_Error del fichero Global.asax para manejar las excepciones.

En cambio, este método no está disponible para los Servicios Web ya que el evento Application_Error no llega a dispararse cuando se lanza una excepción. La razón de esto es que el manejador HTTP (HTTP handler) de los Servicios Web XML captura todas las excepciónes antes del evento Application_Error para transformarlas en mensajes SOAP de excepción.

La solución para conseguir lo mismo que con el evento Application_Error consiste en crear una extensión SOAP que compruebe si existe alguna excepción en el método ProcessMessage.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Services.Protocols;

namespace Custom.WebServices {
   public class SoapExceptionHandler : System.Web.Services.Protocols.SoapExtension {
      public override void ProcessMessage(SoapMessage message) {
         if (message.Stage == SoapMessageStage.AfterSerialize) {
            if (message.Exception != null) {
               Log.Error(message.Exception.InnerException);
            }
         }
      }

      public override object GetInitializer(Type serviceType) {
         return null;
      }

      public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) {
         return null;
      }

      public override void Initialize(object initializer) { }
   }
}

Como se puede ver, sólo tenemos que comprobar que el mensaje se encuentra en el estado "AfterSerialize" (después de serializar) y, una vez que estamos en ese punto, comprobamos si se han recogido excepciones. Cuando detectamos que ha habido una excepción podemos hacer varias cosas, desde escribir la excepción en un fichero de log o a una base de datos hasta enviarnos un e-mail con los datos de la misma.

Una vez tenemos nuestra extensión, podemos registrarla en el web.config para empezar a utilizarla. Lo haremos de la siguiente forma

<webServices>
	<soapExtensionTypes>
   	<add type="<NAMESPACE>.<CLASE>, <ASSEMBLY>" priority="1" group="0"/>
	</soapExtensionTypes>
</webServices>

Donde <NAMESPACE>.<CLASE> son el nombre de la clase y su namespace (en nuestro caso será: Custom.WebServices.SoapExceptionHandler) y <ASSEMBLY> es el nombre del ensamblado donde hayamos incluido la nueva extensión.

No hay que olvidar escribir un cliente para probar nuestra nueva extensión, ya que esta no es usada cuando se invoca el Servicio Web desde el navegador a través de las páginas de prueba que genera .NET.

Nuestra puntuación
Twittear
Compartir
Compartir
Pin