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’