2009-04-14 8 views
2

J'ai une méthode de service Web où je voudrais lancer quelques exceptions personnalisées, par ex. SomeException, SomeOtherException, etc, que le service Web deviendrait alors une faute SOAP que le client serait capable de gérer. En Java, je peux avoir des éléments wsdl: fault dans l'élément wsdl: operation dans le WSDL. Il semble. NET que cela n'est pas pris en compte et qu'il n'y a aucun moyen de mettre des attributs sur un WebMethod pour montrer quelles fautes SOAP peuvent se produire. Si je crée un service Web Java qui contient des éléments wsdl: fault et ajoute une référence Web à un projet .NET, je m'attendrais à ce que les éléments wsdl: fault provoquent la création d'exceptions correctement nommées, tout comme les autres entités créé, cela ne semble toutefois pas être le cas.Services Web .NET 2.0 L'élément WSDL Fault est ignoré?

Est-ce que les éléments wsdl: fault d'un WSDL sont complètement ignorés par .NET? Ils font partie de la spécification WSDL définie à http://www.w3.org/TR/wsdl donc ce n'était pas le comportement que je m'attendais.

Si cela est possible, les contournements risquent de renvoyer un objet de résultat contenant une valeur booléenne succès/échec et un message d'erreur/enum. Ou en utilisant SoapExceptions. Si je choisis d'utiliser SoapExceptions, je mets l'emphèse sur l'utilisateur de mon service web pour les gérer et les désérialiser correctement. Les deux ne semblent pas être un excellent moyen de gérer cela et d'ajouter des problèmes et du code pour contourner ce problème.

Un conseil?

+0

Quel type de client utilisez-vous? Si c'est Silverlight dans un navigateur, il y a des lacunes dans la gestion des fautes SOAP. – sipwiz

+0

Le client est un site Web ASP.NET. – Martin

Répondre

3

Puisque vous demandez .net 2.0 je suppose que vous savez que c'est "fixé" dans WCF où vous pouvez ajouter l'attribut [FaultContract (typeof (YourCustomException))]. La façon «normale» de faire cela dans 2.0 est, comme vous le dites, d'ajouter un message de réponse avec une propriété succès-booléen, résultat et erreur.

Vous pouvez généralement voir comment cela est fait dans EntLib.

+0

Ouais je suis coincé avec .NET 2, je savais à ce sujet dans WCF et espérais qu'il y avait un moyen d'implémenter [FaultContract (typeof (YourCustomException))] dans un service web SOAP dans .NET 2 que je regardais mais regarde comme ce n'est pas le cas. – Martin

+0

On dirait que la meilleure façon de gérer cela sera de suivre le modèle de "success-boolean, Result et une propriété d'erreur". Merci. – Martin

2

Les services Web ASMX ne prenaient pas en charge l'élément wsdl: fault, sur le client ou le serveur. Ils ne le feront jamais.

Comme l'a dit ThorHalvor, le correctif de bogue pour cela est appelé "WCF".

J'ai réussi à écrire un WSDL qui inclut des éléments wsdl: fault, puis les renvoyé via un service Web ASMX en incluant le message d'erreur en tant que propriété Detail d'une exception SoapException. Les clients Java et WCF ont alors correctement vu cela comme une exception du type approprié.

+0

J'ai regardé l'écriture manuscrite du WSDL afin que les autres clients qui travaillent avec wsdl: fault puissent les récupérer. Mais il laisse les gens implémenter l'utilisation de .NET sans pour autant savoir ce qui se passe en termes d'exceptions, à moins qu'ils ne lisent eux-mêmes le WDSL. – Martin

+0

Il est utile de savoir que les services Web ASMX ne prennent pas en charge l'élément d'erreur dans le fichier WSDL. Je savais que ce ne serait pas un problème si j'utilisais WCF mais je ne peux pas le faire pour le moment, j'espérais trouver une solution dans .NET 2 comme dans le titre. – Martin

+0

Non, si votre service envoie une erreur correcte, en remplissant la propriété Detail de SoapException, même un client .NET 2.0 recevra une exception SoapException avec la propriété Detail renseignée. Il ne s'agit pas d'une exception distincte pour chaque erreur. –

2
[return: System.Xml.Serialization.XmlElementAttribute("ResultWS", typeof(ResultWS), Namespace = "http://...")] 
[return: System.Xml.Serialization.XmlElementAttribute("ResultFaultWS", typeof(ResultFaultWS), Namespace = "http://...")] 
public object SumTest_Operation([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://...")] ParamWS param) 
{    
    ResultWS result = null; 
    try 
    { 
     result.Value = param.P1 + param.P2;    

    } 
    catch (Exception) 
    { 
     ResultFaultWS resultFault = new ResultFaultWS(); 
     resultFault.Status = noOK; 

     return resultFault;; 
    } 
    return result; 
}