manejo de excepciones WCF lanzar un error
-
26-09-2019 - |
Pregunta
Hola Tengo un manejo de excepciones en WCF problema. Tengo un servicio como éste:
[ServiceContract]
public interface IAddressService
{
[OperationContract]
[FaultContract(typeof(ExecuteCommandException))]
int SavePerson(string idApp, int idUser, Person person);
}
Me llamo el SavePerson () en el servicio en la utilidad WcfTestClient. La aplicación SavePerson () es:
public int SavePerson(string idApp, int idUser, Person person)
{
try
{
this._savePersonCommand.Person = person;
this.ExecuteCommand(idUser, idApp, this._savePersonCommand);
return this._savePersonCommand.Person.Id;
}
catch (ExecuteCommandException ex)
{
throw new FaultException<ExecuteCommandException>(ex, new FaultReason("Error in 'SavePerson'"));
}
}
Pero me sale este error:
No se ha podido invocar el servicio. Posible causas: el servicio está fuera de línea o inaccesible; el lado del cliente configuración no coincide con el apoderado; el proxy existente no es válido. Consulte el seguimiento de pila para obtener más detalle. Se puede tratar de recuperar por iniciar un nuevo proxy, la restauración de configuración predeterminada, o refrescante el servicio.
si cambio el método SavePerson y en lugar de:
catch (ExecuteCommandException ex)
{
throw new FaultException<ExecuteCommandException>(ex, new FaultReason("Error in 'SavePerson'"));
}
hacer
catch(Exception)
{
throw;
}
No consigo el error anterior, pero solo me dan el mensaje de excepción y no la excepción interna. ¿Qué estoy haciendo mal?
Solución
Cuando se define el contrato de fallo:
[FaultContract(typeof(ExecuteCommandException))]
no se debe especificar un tipo de excepción. En su lugar, se especifica un contrato de datos de su elección para pasar de nuevo a los valores que se consideren necesarios.
Por ejemplo:
[DataContract]
public class ExecuteCommandInfo {
[DataMember]
public string Message;
}
[ServiceContract]
public interface IAddressService {
[OperationContract]
[FaultContract(typeof(ExecuteCommandInfo))]
int SavePerson(string idApp, int idUser, Person person);
}
catch (ExecuteCommandException ex) {
throw new FaultException<ExecuteCommandInfo>(new ExecuteCommandInfo { Message = ex.Message }, new FaultReason("Error in 'SavePerson'"));
}