2009-07-20 9 views
6

Ma méthode de service Web renvoie un objet de collection, cela sérialisera bien, grâce au fonctionnement des services Web C#!Comment renvoyer des erreurs d'un service Web ASMX?

Mais si mon code renvoie une exception non interceptée, je souhaite renvoyer un objet d'erreur personnalisé. Est-ce possible en utilisant C# ASP.NET v2?

Est-ce possible en utilisant C# ASP.NET v2?

Par exemple,

Fonctionnement normal doit retourner:

<Books> 
    <book>Sample</book> 
    <book>Sample</book> 
</Books> 

Mais en cas d'erreur je veux

<error> 
     <errorMessage></errorMessage> 
    </error> 
+0

Notez que les services Web ASMX ne prennent pas correctement en charge les défaillances SOAP. Le WSDL généré ne définit pas les défauts, ce qui amène certains clients à les ignorer ou à renvoyer des erreurs fatales lorsqu'ils sont reçus. Utilisez plutôt WCF pour éviter ce problème. –

Répondre

7

Oui, cela est possible.

Ce que vous devez examiner est le SoapException class, et plus précisément le Detail property de la classe SoapException. La classe SoapException affichera effectivement un "Soap Fault", qui est le mécanisme conforme aux normes pour renvoyer des informations d'erreur aux clients/consommateurs à partir d'une méthode de service Web.

La propriété "Detail" de la classe SoapException est de type XmlNode et peut donc contenir un seul nœud/élément ou une hiérarchie de nœuds enfants. Le nœud Détail pourrait donc facilement contenir et agir en tant que «parent» pour la représentation sérialisée de votre propre objet d'erreur personnalisé.

De MSDN:

La propriété Détail est destiné à fournir des détails d'erreur spécifiques d'application liés à l'élément du corps de la requête SOAP. Selon la spécification SOAP, si une erreur se produit parce que la demande du client n'a pas pu être traitée en raison de l'élément Body de la requête SOAP, la propriété Detail doit être définie. Si une erreur s'est produite dans les entrées d'en-tête de la requête SOAP, vous devez lancer une exception SoapHeaderException, afin que les détails de l'erreur soient renvoyés dans l'en-tête SOAP. Si l'erreur ne s'est pas produite, en raison du traitement de l'élément Body, la propriété Detail ne doit pas être définie.

Lors de la construction d'un XmlNode pour la propriété Detail, les propriétés Name et Namespace de DetailElementName peuvent être utilisées pour assurer la cohérence avec la spécification SOAP.

Tous les éléments enfants immédiats de l'élément detail sont appelés entrées de détail et chaque entrée de détail est codée en tant qu'élément indépendant dans l'élément detail.

Notez que si vous souhaitez rester correctement SOAP conforme à vos réponses de service Web, vous aurez besoin de retourner un SoapHeaderException plutôt que d'un SoapException si l'erreur se produit dans la section d'en-tête du client de la demande XML d'origine (Cela peut souvent être le cas lorsque vous utilisez custom SOAP headers pour des informations d'identification de sécurité, par exemple) comme indiqué ci-dessus.

+0

Pourriez-vous s'il vous plaît fournir un exemple? –

+0

@JL - Le lien de la classe SoapException dans ma réponse (premier lien) contient un exemple de code dans VB et C# pour lancer un message d'erreur "personnalisé". Certes, il crée la propriété Detail en créant et en ajoutant manuellement un objet XmlNode, mais cela pourrait être remplacé par un Xml créé à partir de la sérialisation de votre propre objet, peut-être en utilisant la classe System.Xml.Serialization.XmlSerializer. Voir ici: http://support.microsoft.com/kb/815813 – CraigTP

+0

Réponse absolument parfaite! Merci Craig ... Je recommande fortement à tous ceux qui essaient de retourner un objet d'erreur personnalisé d'aller plutôt avec l'exception SOAP standard. Son standardisé, il est donc facile de justifier une telle action. –

Questions connexes