Plusieurs espaces de noms dans un message d'erreur soap entraînant l'échec de la désérialisation FaultException

StackOverflow https://stackoverflow.com/questions/1441647

Question

Nous nous connectons à un service Web et le message d'erreur renvoyé n'est en aucun cas une désérialisation. Aucune version de classe que je peux créer ne désérialisera correctement. Nous n'avons aucun contrôle sur le côté serveur des choses. Le serveur n'autorisant pas la découverte, l'ajout de? WSDL à la fin de l'URL du noeud final entraîne une erreur et non un WSDL.

[Fiddler] [1] montre que le message d'erreur qui revient ressemble à:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:eGov="http://eGov.gov" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <soapenv:Fault>
    <faultcode>Client</faultcode>
    <faultstring/>
      <detail>
        <eGov:eGov2Exception>
          <eGov:ErrorClassification>SOME_ERROR</eGov:ErrorClassification>
          <eGov:ErrorCode>SOME_ERROR_CODE</eGov:ErrorCode>
          <eGov:ErrorMessage>Your request was unsuccessful. blah blah blah.</eGov:ErrorMessage>
        </eGov:eGov2Exception>
      </detail>
    </soapenv:Fault>
  </soapenv:Body>
</soapenv:Envelope>

Pourtant, aucune classe que nous avons créée (essayer xsd.exe, svcutil et d'autres, y compris le code que nous avons écrit à partir de rien) ne peut la désérialiser lorsque nous essayons de l'attraper avec:

catch (FaultException<eGov2ExceptionType> exp)
  {
     // Never stops here. 
  }
catch (FaultException<AllOtherAttemptedClasses> exp)
  {
     // Never stops here. 
  }
catch (SoapException se)
  {
     // Never stops here. 
  }
catch (FaultException exp)
  {
     //Always gets caught here. 
  }

Seule la capture de base FaultException sera appelée, ce qui signifie que nous perdons le contenu du message FaultMessage envoyé. Certaines des classes que j'ai écrites seront sérialisées de façon très proche de l'exemple ci-dessus, mais ne parviennent pas à le désérialiser. C'est pourquoi nous soupçonnons qu'il existe un problème d'espace de noms.

Questions:

1 - Comment écririez-vous cela?

2 - S'agit-il d'une erreur ou d'un problème courant avec WCF?

[1]: http://www.fiddler2.com/fiddler2/ Fiddler

Était-ce utile?

La solution

Ce que nous avons fini par faire, c’est d’arrêter de tenter de rattraper la Fault et de la renvoyer dans le canal SOAP. Au lieu de cela, nous avons créé une exception personnalisée et câblé un MessageInspector pour surveiller les erreurs et le jeter comme une exception.

La partie pertinente du code (assaini):

   public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        if (reply.IsFault)
        {
            XmlDictionaryReader xdr = reply.GetReaderAtBodyContents();
            XNode xn = XDocument.ReadFrom(xdr);
            string s = xn.ToString();
            XDocument xd = XDocument.Parse(s);
            XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/";
            XNamespace ns = "http://eGov.gov";
            XElement xErrorClass = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorClassification");
            XElement xErrorCode = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorCode");
            XElement xErrorMessage = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorMessage");

            throw new eGovException(xErrorClass.Value, xErrorCode.Value, xErrorMessage.Value);
        }
    }

L’application principale utilise ensuite:

catch (eGovException ex)
  {
    // Gère l'exception ici.
  }

Beaucoup trop de temps a été perdu à essayer de corriger les espaces de noms. Merci de répondre.

Autres conseils

Pour résoudre ce problème si la sérialisation échoue complètement, utilisez un OoperationContract à l'aide de Le message est entré et sorti. De cette façon, vous pouvez analyser manuellement le code XML lorsque Iffault == true ou utiliser GetBody () pour obtenir le contenu normal si aucune erreur ne survient.

Tout d’abord, si vous ne pouvez pas obtenir le WSDL des personnes qui ont créé ce service Web, ils n’ont aucune raison de disposer d’un service Web basé sur SOAP. Un WSDL approprié résoudrait votre problème, que ce soit ou non?? WSDL " est utilisé.

Deuxièmement, postez le code de la classe eGov2ExceptionType . Je soupçonne qu’il n’a pas l’espace de noms http://eGov.gov défini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top