2009-05-13 9 views
1

J'utilise actuellement un service C# .NET dans notre programme client. Dans le cadre de la conception du serveur, plusieurs exceptions personnalisées sont générées pour indiquer des erreurs spécifiques (comme dans tout programme de bureau normal). Le problème est que le service Web intercepte ces erreurs et les sérialise dans une exception FaultException, avec l'exception réelle (comme NoRoomsAvailableException) écrite dans le champ Message.Prise en compte correcte d'exceptions spécifiques via le service Web

Ma question est de savoir s'il existe une bonne pratique pour gérer ces erreurs. Nous venons tout juste de commencer à travailler dessus, et nous ferions probablement des correspondances de type texte pour extraire le type d'exception et le message d'erreur, mais cela semble être une façon de le faire, donc toute façon "propre" de le faire serait apprécié.

Répondre

2

La bonne façon serait de définir des contrats de défaut. Par exemple, dans votre service Web, vous pouvez effectuer les opérations suivantes:

[DataContract] 
public class NoRoomsAvailableFaultContract 
{ 
    [DataMember] 
    public string Message { get; set; } 
} 

Ensuite, vous déclarez ce contrat pour une opération de service donné

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [OperationContract] 
    [FaultContract(typeof(NoRoomsAvailableFaultContract))] 
    void MyOperation(); 
} 

Et vous implémentez comme ceci:

public class MyService : IMyServiceContract 
{ 
    public void MyOperation() 
    { 
     if (somethingWentWrong) 
     { 
      var faultContract = new NoRoomsAvailableFaultContract() 
      { 
       Message = "ERROR MESSAGE" 
      }; 
      throw new FaultException<NoRoomsAvailableFaultContract>(faultContract); 
     } 
    } 
} 

Dans ce cas, le NoRoomsAvailableFaultContract sera exposé dans le WSDL et svcutil.exe pourrait générer une classe proxy. Alors vous pourriez attraper cette exception:

try 
{ 
    myServiceProxy.MyOperation(); 
} 
catch (FaultException<NoRoomsAvailableFaultContract> ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
+0

Je suppose que cela signifie que je peux séparer FaultException de FaultException dans mes instructions catch? –

+0

Oui, vous pouvez attraper différentes exceptions de faute. –

0

darin a la bonne réponse. Je vais seulement dire explicitement ce qu'il implique: les services web ne passent pas d'exceptions. Ils renvoient des fautes de savon. Si vous définissez vos fautes correctement, comme il le fait, alors vous devez lancer FaultException < faute>. Cela deviendra une erreur SOAP avec l'erreur dans l'élément de détail. Dans le cas d'un client .NET, ceci sera alors transformé en une erreur FaultException < > que vous pouvez attraper.

D'autres plates-formes peuvent gérer cela différemment. J'ai vu IBM Rational Web Developer générer du code proxy Java qui crée une exception distincte pour chaque erreur déclarée. C'était une version antérieure aux génériques Java, alors peut-être que maintenant, ça fait la même chose que .NET.

Questions connexes