FaultContract – Definiendo Excepciones en WCF

Y es que uno de los principales problemas que nos encontrábamos los desarrolladores de Servicios Web .NET de la versión 2.0, es cómo lanzar las excepciones tipificadas que definí­amos en la capa de negocio para que pudieran ser capturadas desde la capa de presentación.
Para los que os hayáis encontrado ya con el problema, sabréis que toda excepción generada desde un Servicio Web .NET 2.0 llega a la capa de presentación como SoapException… por lo que es imposible tipificar en el cliente cuál ha sido exactamente el error generado por la capa de negocio. Hay algíºn truquillo por ahí­ pasando un XML en la SoapException y leyendo el XML desde el cliente, pero nunca me ha acabado de convencer.
Con la etiqueta FaultContract de WCF el problema ya está resuelto y vamos a ser capaces de definir excepciones en la capa de servicios que pueden ser capturadas desde el cliente. Os adjunto al post la solución de servicios polimórficos que vimos semanas atrás, añadiendo la casuí­stica de la generación de excepciones y captura desde el cliente.
Fijaros entre otras cosas del código situado en Base.DAOException, que es la clase que utilizamos para el transporte de la excepción (atención, no hereda de Exception).
También en el interfaz que expone IMiServicio.cs, que es donde veréis que además del atributo “OperationContract” por cada uno de los métodos, también definimos “FaultContract”, asociado al tipo de excepción que va a ser capaz de lanzar dicho método.
[FaultContract(typeof(Base.DAOException))]
Fijaros en MarcaDAO.Update cómo lanzamos la excepción.
throw new FaultException<Base.DAOException>(new Base.DAOException(ex));
Pero, sobre todo, fijaros cómo se captura en el cliente Form1.cs
catch (FaultException<Servicio.DAOException> ex)
WCF Ejemplo FaultContract
Saludos
Miguel

3 thoughts on “FaultContract – Definiendo Excepciones en WCF”

  1. La filosofia del post es buenisima pero el ejemplo no funciona.Cuando relanzas la excepcion da el siguiente error:
    “{El creador de este error no especificó una razón.}”, y por consiguiente el cliente no se entera de la excepción.
    ¿Sabes si hay algíºn truco?. Lo he provado en VS 2008

  2. Hola Pedro,
    La excepción viene en la propiedad de la clase que se define desde el servicio de WCF. Reviso de todas maneras el proyecto que subí­, ¿has ejecutado directamente sin modificar código?
    Un saludo y gracias por la aportación.
    Miguel.

  3. Amigo,, esto pasa por que desde el cliente no estas accediendo a tu SoapException,,, el cual es almacenado en la propiedad Detail del objeto FaultException que hace un cast a tu tipo de exception que definistes y envias desde tu capa de servicios
    Arrojando el Exception desde la capa de servicios,
    throw new WCF.FaultException(new FaultEmision() { MsgFaultEmision = ex.Message });
    Capturando la excepcion desde el cliente
    catch (FaultException ex)
    {
    mensaje.Show(ex.Detail.Propiedad);
    }
    Saludos

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.