Question

J'ai couru dans un problème exaspérant obtenir un client de service Java pour communiquer avec succès avec un service WCF. J'ai surmonté de nombreux obstacles, et je crois que ceci est mon dernier. Le problème se résume à la façon dont Java Axis + WSS4J semblent gérer les espaces de noms XML. La plate-forme Java semble être très rigide dans ce qu'ils attendent pour les préfixes d'espaces de noms XML, et en tant que tels, ne comprennent pas la WCF messages de réponse.

Mon problème en quelques mots est la suivante. J'ai une réponse XML semblable au suivant de mon service WCF:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <s:Header>
      <a:Action s:mustUnderstand="1" u:Id="_3">http://tempuri.org/IProcessor/DoProcessingResponse</a:Action>
      <h:CorrelationID xmlns:h="http://tempuri.org/">1234</h:CorrelationID>
      <a:RelatesTo u:Id="_4">uuid:40f800a0-9613-4f4a-96c5-b9fd98085deb</a:RelatesTo>
      <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <!-- WS-Security header stuff -->
      </o:Security>
   </s:Header>
   <s:Body u:Id="_1">
      <e:EncryptedData Id="_2" Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
         <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
         <e:CipherData>
            <e:CipherValue>NfA6XunmyLlT2ucA+5QneoawHm+imcaCltDAJC1mRZOSxoB6YGpDLY1FyVykPbPGDoFGUESLsmvvbD62sNnRrgE+AuKPo+1CD3DF4LfurRcEv9A50ba9V+ViqlrhydhK</e:CipherValue>
         </e:CipherData>
      </e:EncryptedData>
   </s:Body>
</s:Envelope>

Cette réponse utilise de simples préfixes d'espace de noms d'un caractère pour la plupart des choses, telles que 's' pour enveloppe SOAP, 'a' pour WS-Addressing, 'o' pour 'WS-Security', etc. Le client Java, à savoir WSS4J, semble attendre ce qui suit:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <soap:Header>
      <wsa:Action soap:mustUnderstand="1" wsu:Id="_3">http://tempuri.org/IProcessor/DoProcessingResponse</wsa:Action>
      <h:CorrelationID xmlns:h="http://tempuri.org/">1234</h:CorrelationID>
      <wsa:RelatesTo wsu:Id="_4">uuid:40f800a0-9613-4f4a-96c5-b9fd98085deb</a:RelatesTo>
      <wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <!-- WS-Security header stuff -->
      </wsse:Security>
   </soap:Header>
   <soap:Body u:Id="_1">
      <xenc:EncryptedData Id="_2" Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
         <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
         <xenc:CipherData>
            <xenc:CipherValue>NfA6XunmyLlT2ucA+5QneoawHm+imcaCltDAJC1mRZOSxoB6YGpDLY1FyVykPbPGDoFGUESLsmvvbD62sNnRrgE+AuKPo+1CD3DF4LfurRcEv9A50ba9V+ViqlrhydhK</xenc:CipherValue>
         </xenc:CipherData>
      </xenc:EncryptedData>
   </soap:Body>
</soap:Envelope>

Lors de la réception de mon message de réponse, le client Java et WSS4J semblent vouloir rechercher des éléments par leurs propres alias xml internes, tels que « WSA » pour WS-Addressing, et « wsse » pour les extensions WS-Security. Étant donné qu'aucun de ces espaces de noms sont présents dans le xml de réponse réelle, des exceptions sont levées.

Je me demande s'il y a un moyen simple de transformer un document XML à partir d'un ensemble d'espaces de noms à un autre ensemble en utilisant C #, .NET, et l'espace de noms System.Xml. Je l'ai poussé autour avec XmlNamespaceManager un peu, mais il ne semble pas soutenir pleinement ce que je dois ... ou tout au moins, je suis incapable de trouver des exemples vraiment utiles, et ne suis pas entièrement sûr de savoir comment cela fonctionne. J'essaie d'éviter d'avoir à écrire un processus lourd à gérer moi-même manuellement, comme je ne veux pas avoir un impact considérablement la performance de nos services lorsqu'il est appelé par un client Java Axis / WSS4J.

Était-ce utile?

La solution

Ce problème particulier semblait provenir d'une ancienne version et le buggy de WSS4J. Les versions plus récentes ne semblent pas avoir ce problème, et il n'est plus un problème.

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