jueves, febrero 10, 2011

Cómo propagar excepción "FaultException" en un servicio web WCF

El problema:  Utilizando correctamente excepciones de tipo FaultExcepction en un servicio web WCF no es posible propagarlas/capturarlas a/en un cliente.

La definición de la excepción a propagar:
[DataContract]
public class SrvFaultException
{
    [DataMember]
    public FaultCode errorcode;
    [DataMember]
    public string Reason;
    [DataMember]
    public string details;
}

El interfaz del servico:
[ServiceContract]
public interface IUnServicio
{
    [OperationContract]
    [FaultContract(typeof(SrvFaultException))]
    String UnMetodo(String datos);
}

La implementación del servicio:
public class UnServicio : IUnServicio
{
    public String UnMetodo(String datos)
    {
        Try {
            //...algo se peta estrepitosamente.
        }
        catch (Exception ex) {
            SrvFaultException faultException = new SrvFaultException();
            faultException.errorcode = FaultCode.ERROR;
            faultException.Reason = Properties.Resources.errPerLoteSelect;
            faultException.details = ex.Message;
            throw new FaultException<SrvFaultException>(faultException,
                                                        new FaultReason(ex.Message));
        }
    }
}

El cliente que consume el servicio
public String InvocarUnMetodo(string datos)
{
    Try {
        using (UnServicioClient s = new UnServicioClient("NetTcpBinding_IUnServicio")){
            return s.UnMetodo(datos);
        }
    }
    catch (FaultException<SrvFaultException> faultEx){
        throw faultEx;
    }
    catch (Exception ex) {
        throw ex;
    }
}

Ejecutando la aplicación desde el entorno de desarrollo suelen ocurrir dos cosas:
·         el depurador se para en  throw new FaultException… en la implementación del servicio web que pretende lanzar la excepción
·         el depurador se para en el proxy del servicio web (código autogenerado dentro de Service References) con el mensaje: User unhandled exception

La solución:
En VS2100
1.       Ir a al menu Debug / Exceptions
2.       Buscar la excepción ‘FaultException’
Common Language Runtime Exceptions
System.ServiceModel
System.ServiceModel.FaultException
(o bien pulsar en Find y escribir ‘FaultException’ :-) )
3.       Desmarcar casilla ‘User Unhandled’

No hay comentarios.: