Manejo de excepciones en WCF

Las excepciones son errores que ocurren en tiempo de ejecución; el manejo de excepciones es la técnica para manejar estos errores en tiempo de ejecución. Normalmente, usaría bloques try, catch y finalmente (también conocidos como bloques de excepción) en el código de su aplicación para manejar excepciones. Si las excepciones no se manejan correctamente en el código de la aplicación y se ha producido una excepción en tiempo de ejecución, la ejecución de la aplicación finalizaría.

El manejo de excepciones en WCF no es tan sencillo: está limitado a enviar objetos .Net a través del cable y su servicio WCF solo puede enviar datos serializados, es decir, mensajes SOAP al cliente. Puede controlar las excepciones en WCF de una de estas tres formas:

  1. Usando FaultException
  2. Usando IErrorHandler
  3. Usando returnUnknownExceptionsAsFaults

En esta publicación, presentaré una discusión sobre las diversas formas en que los mensajes de excepción se pueden transmitir desde el servicio WCF a los consumidores del servicio.

Considere este simple servicio WCF.

[Contrato de servicios]

interfaz pública IDBManagerService

    {

        [OperationContract]

        anular Guardar (empleado emp);

    }

El contrato de servicio IDBManagerService contiene un contrato de operación para conservar un objeto de empleado en la base de datos.

DBManagerService de clase pública: IDBManagerService

    {

        anular Guardar (Empleado emp)

        {

         tratar

           {

            // Código para almacenar un objeto de empleado en la base de datos

           }

           catch (Excepción ex)

           {

               lanzar una nueva excepción ("Se produjo un error al guardar los datos ...");

           }

        }

    }

Ahora suponga que hay un error al conectarse a la base de datos o al almacenar el objeto de empleado en la base de datos en el momento en que intenta consumir el servicio. Luego, obtendría una excepción con este mensaje: "System.ServiceModel.FaultException: el servidor no pudo procesar la solicitud debido a un error interno. Para obtener más información sobre el error, active IncluirExceptionDetailInFaults (ya sea desde ServiceBehaviorAttribute o desde la configuración comportamiento) en el servidor para enviar la información de la excepción al cliente, o activar el seguimiento según la documentación del SDK de Microsoft .Net Framework 3.0 e inspeccionar los registros de seguimiento del servidor ".

Puede usar establecer el elemento includeExceptionDetailInFaults en verdadero en el archivo web.config para que los detalles adicionales de la excepción se incluyan en la falla para que sea más conveniente para usted inspeccionar lo que realmente salió mal.

También puede lograr esto escribiendo código. Aquí hay un fragmento de código que ilustra cómo puede establecer esta propiedad en true.

    typeof (ServiceDebugBehavior));

    new ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

También puede establecer esto en true usando la etiqueta ServiceBehavior como se muestra a continuación.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

DBManagerService de clase pública: IDBManagerService

{

}

Cuando intente consumir el servicio nuevamente, verá un mensaje de excepción más preciso.

Usando FaultException

Sin embargo, si necesita pasar mensajes de excepción fáciles de usar desde el servicio, debe lanzar excepciones de fallas. Las excepciones de error son excepciones que genera un servicio WCF cuando se produce una excepción en tiempo de ejecución; estas excepciones se usan normalmente para transmitir datos de error sin tipo a los consumidores del servicio. Puede manejar las excepciones en sus métodos de servicio de la misma manera que lo hace con otros métodos y luego convertirlos en excepciones de fallas.

El fragmento de código a continuación muestra el método de servicio actualizado: el método de servicio ahora arroja una excepción de falla.

DBManagerService de clase pública: IDBManagerService

    {

        anular Guardar (Empleado emp)

        {

            tratar

            {

               // Código para almacenar un objeto de empleado en la base de datos

            }

            catch (Excepción ex)

            {

               lanzar una nueva FaultException ("Se produjo un error al guardar los datos ...");

            }

        }

    }

Ahora necesitaría manejar la excepción de falla en su código al consumir este servicio. Puede obtener más información sobre las excepciones de errores en WCF en este artículo de MSDN.

También puede crear una clase de error personalizada que esté marcada con el atributo DataContract.

[DataContract]

clase pública CustomFault

{

[DataMember]

Fuente de cadena pública;

[DataMember]

public string ExceptionMessage;

[DataMember]

public string InnerException;

[DataMember]

cadena pública StackTrace;

}

El siguiente fragmento de código ilustra cómo puede usar la clase CustomFault para generar FaultException fuertemente tipada.

anular Guardar (Empleado emp)

{

tratar

{

  // Código para guardar el objeto del empleado en la base de datos

}

captura (Excepción ex)

{

CustomFault cx = new CustomFault ();

lanzar una nueva FaultException (por ejemplo, new FaultReason ("Esta es una excepción con errores fuertemente tipados"));

}

}

También necesitaría especificar el atributo FaultContract en su método de servicio que generaría FaultException. El método Save modificado se vería así.

[Contrato de servicios]

interfaz pública IDBManagerService

    {

        [OperationContract]

        [FaultContract]

        anular Guardar (empleado emp);

    }

Usando returnUnknownExceptionsAsFaults

Puede utilizar el atributo returnUnknownExceptionsAsFaults en la configuración del comportamiento del servicio para generar una excepción como un error SOAP automáticamente. El siguiente fragmento de código ilustra cómo puede lograrlo.

                 returnUnknownExceptionsAsFaults = "Verdadero">

Manejo de excepciones a nivel mundial

Otra forma de manejar las excepciones en WCF es implementando la interfaz IErrorHandler en su clase de servicio para manejar todas las excepciones globalmente y proporcionar una FaultException compatible con SOAP. Esta interfaz contiene dos métodos: HandleError y ProvideFault. Mientras que el primero se usa para realizar alguna actividad con el error, el segundo se usa para devolver un mensaje de falla. Tenga en cuenta que también puede configurar IErrorHandler (activarlo o desactivarlo) en el archivo configurable de su servicio.