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?

¿Fue útil?

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'")); 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top