Je suis tombé sur un problème exaspérant d'avoir un client de service Java pour communiquer avec succès avec un service WCF. J'ai surmonté de nombreux obstacles et je crois que c'est mon dernier. Le problème se résume à la façon dont Java Axis + WSS4J semble gérer les espaces de noms XML. La plate-forme Java semble être très rigide en ce qu'elle attend pour les préfixes d'espace de noms xml, et en tant que tel, ne comprend pas les messages de réponse WCF.Convertir les préfixes d'espace de noms XML avec C#?
Mon problème en un mot est le suivant. 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 des préfixes d'espaces de noms simples d'un seul 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 les éléments suivants:
<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>
Dès réception de mon message de réponse, le client Java et WSS4J semblent vouloir regarder des éléments par leurs propres alias internes xml, tels que 'wsa' pour WS-Addressing, et 'wsse' pour WS-Security Extensions. Comme aucun de ces espaces de noms n'est présent dans la réponse xml, des exceptions sont levées. Je me demande s'il existe un moyen simple de transformer un document XML d'un ensemble d'espaces de noms en un autre ensemble en utilisant C#, .NET et l'espace de noms System.Xml. Je me suis un peu amusé avec XmlNamespaceManager, mais il ne semble pas supporter pleinement ce dont j'ai besoin ... ou du moins, j'ai été incapable de trouver des exemples vraiment utiles, et je ne suis pas tout à fait sûr comment cela fonctionne. J'essaie d'éviter d'avoir à écrire moi-même des procédures lourdes pour gérer cela manuellement, car je ne veux pas avoir un impact important sur les performances de nos services lorsqu'elles sont appelées par un client Java Axis/WSS4J.