Votre service doit gérer toutes les exceptions et les encapsuler dans FaultException où T est un contrat de données que vous avez écrit. Ainsi, la première étape consiste à définir un contrat de données personnalisé qui contiendra les informations sur votre exception :
[DataContract]
public class CustomFault
{
public string Message { get; set; }
}
Ensuite, vous indiquez à votre contrat de service que ses méthodes pourraient potentiellement générer une FaultException. Cela permet au service d'exposer la classe CustomFault dans le wsdl, afin que les clients puissent générer une classe proxy :
[ServiceContract]
public interface IMyServiceContract
{
[FaultContract(typeof(CustomFault))]
void MyMethod(string someArgument);
}
La prochaine étape consiste à implémenter cette interface :
public class MyService : IMyServiceContract
{
public void MyMethod(string someArgument)
{
// Faites quelque chose ici qui pourrait générer des exceptions mais ne les attrapez pas encore
}
}
Pour gérer les exceptions, vous pouvez implémenter IErrorHandler qui sera utilisé chaque fois qu'une des méthodes de votre service générera une exception. Le but de ce gestionnaire d'erreur est d'encapsuler l'exception dans FaultException :
public class MyErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message msg)
{
var customFault = new CustomFault()
{
Message = error.Message,
};
var fe = new FaultException(customFault);
MessageFault fault = fe.CreateMessageFault();
string ns = "http://somenamespace/whatever";
msg = Message.CreateMessage(version, fault, ns);
}
}
Une fois que vous avez enregistré votre gestionnaire d'erreurs, du côté client, vous obtiendrez toujours FaultException.