Votre service doit gérer toutes les exceptions et les placer dans FaultException <T> où T est un contrat de données que vous avez écrit. La première étape consiste à définir un contrat de données personnalisé qui contiendra vos informations d'exception:
[DataContract]
public class CustomFault
{
public string Message { get; set; }
}
Ensuite, vous demandez à votre contrat de service que ses méthodes pourraient jeter FaultException <CustomFault>. 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);
}
L'étape suivante consiste à mettre en œuvre cette interface:
public class MyService : IMyServiceContract
{
public void MyMethod(string someArgument)
{
// Do something here that could throw exceptions but don't catch yet
}
}
Pour gérer les exceptions que vous pourriez mettre en œuvre IErrorHandler qui sera utilisé chaque fois qu'une de vos méthodes de service déclenche une exception. Le but de ce gestionnaire d'erreur est d'envelopper l'exception dans FaultException <CustomFault>:
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>(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 <CustomFault>.
La chose wierd est que la même exception, parfois throws comme une exception FaultException générique. – mrtaikandi