Un exception en WCF est définie grâce à une FaultException contenant un "Object DataContractSerializable".
Cet object est la raison de votre exception, sa cause.
Prenons comme exemple un simple login(string nom, string mdp);
- Il nous faut premièrement définir l' "Object DataContractSerializable" que nous allons utiliser pour expliquer au client pourquoi la fonction ne peut pas se dérouler avec succes:
[code:c#]
namespace myWCFService
{
[DataContract]
public class myWCFServiceFault
{
private string _msg;
[DataMember]
public string Msg
{
get { return _msg; }
set { _msg = value; }
}
public myWCFServiceFault(string m)
{
this._msg = m;
}
}
}
[/code}
- Ensuite, il va nous falloir signaler au client que cette fonction peut éventuellement lancer une FaultException contenant une raison de type myWCFServiceFault.
Ceci se définit dans l'interface de notre service :
[code:c#]
namespace myWCFService
{
[ServiceContract(SessionMode=SessionMode.Required)]
public interface ImyWCFService
{
[OperationContract]
[FaultContract(typeof(myWCFServiceFault))]
void Login(string Login, string Mdp);
}
}
[/code}
- Dans l'implémentation de ce web service, il nous suffit alors de lancer inocament une FaultException, elle sera envoyée au client :
[code:c#]
namespace myWCFService
{
public class myService: ImyWCFService
{
public void Login(string login, string Mdp)
{
if(login == "")
throw new FaultException<myWCFServiceFault>(new myWCFServiceFault("login ne peut pas être vide!"));
}
}
}
[/code]
- Coté client maintenant, il nous suffit d'attraper au vol cette exception :
[code:c#]
try
{
myService.Login("Togis", "PasswordSuperSecret");
}
catch (FaultException<myWCFServiceFault> fex)
{
Console.WriteLine("FaultException > " + fex.Detail.Msg);
}
catch (FaultException faultEx)
{
Console.WriteLine("An unknown exception was received. "
+ faultEx.Message
+ faultEx.StackTrace);
}
[/code]
Notez qu'il existe un catch d'une FaultException non générique, pour pouvoir l'utiliser, il faut tout d'abord utiliser un autre constructeur de la FaultException :
[code:c#]
throw new FaultException<MiniMixFault>(myWCFServiceFault Exception,FaultReason reason);
[/code]
Et le tour est joué ;)