Manejador global de excepciones en ADO.NET Data Services

Si tenemos la necesidad de incorporar a nuestro servicio WCF un manejador global de excepciones para capturar y tratar las excepciones que no manejamos en nuestros bloques try-catch, podemos seguir los siguientes pasos que se indican en este post.

Pero si nuestra necesidad es el incluir un manejador global de excepciones en un servicio WCF ADO.NET Data Services, no nos servirá esta solución, ya que solo se capturarán las excepciones que se generen en el método de inicialización del servicio InitializeService, ni las excepciones no manejadas en nuestos ServiceOperation ni en los ChangeInterceptor serán capturadas.

Para tal propósito, tenemos a nuestra disposición el método virtual HandleException, que recibe un solo parámetro de tipo HandleExceptionArgs, en el que tenemos toda la información disponible sobre la excepción que se acaba de producir y, además, nuestra ya conocida propiedad booleana UseVerboseErrors. Hay que recordar que el valor de esta propiedad solo influye en la información que va a ser mostrada en el error de la request, la información que va a ser escrita a log será siempre la misma.

Por poner un ejemplo en código, trataremos las excepciones no capturadas por nuestros boques try – catch traceándolas al log del aplicación. Básicamente, tenemos un ServiceOperation que, al ser llamado, provoca una excepción no manejada. Si colocamos un punto de interrupción en el método HandleException, veremos cómo ese método se ejecuta y nuestra excepción no tratada se tracea:

namespace Plainconcepts.Server

{

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]

    public class PlainDataService : DataService<PlainEntities>

    {

       public static void InitializeService(DataServiceConfiguration config)

        {

            config.SetEntitySetAccessRule("*", EntitySetRights.All);

            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);

            config.UseVerboseErrors = true;

        }

 

        [WebGet()]

        public IQueryable<Master> GetMasterById(int id)

        {

            throw new InvalidOperationException();

            return this.CurrentDataSource.Master.Where(m => m.IdMaster == id);

        }

 

       protected override void HandleException(HandleExceptionArgs args)

       {

          if (!EventLog.SourceExists("Operations"))

                 EventLog.CreateEventSource("Operations", "Application");

 

         EventLog.WriteEntry("Operations", args.Exception.ToString());

        }

    }

}

Publicado por

Vicente García Diez

Mi nombre es Vicente García Diez y soy arquitecto empresarial, experto en tecnologías Microsoft y transformaciones digitales complejas. Soy socio director y Trusted Advisor en abstratio En mi blog trataré temas de Estrategia IT y lecciones aprendidas en mis proyectos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *