JavaサービスクライアントがWCFサービスと正常に通信できるようにするという厄介な問題が発生しました。私は多くのハードルを乗り越えてきましたが、これが私の最後のハードルだと思います。問題は、Java Axis+WSS4Jがxml名前空間をどのように処理するように見えるかに要約されます。Javaプラットフォームは、xml名前空間プレフィックスに期待するものに非常に厳格であるように思われるため、WCF応答メッセージを理解していません。
一言で言えば、私の問題は次のとおりです。WCFサービスから次のようなxml応答があります。
<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>
この応答では、SOAPエンベロープの場合は「s」、WS-Addressingの場合は「a」、「WS-Security」の場合は「o」など、ほとんどの場合に単純な1文字の名前空間プレフィックスが使用されます。Javaクライアント、つまりWSS4Jは次のことを期待します。
<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>
応答メッセージを受信すると、JavaクライアントとWSS4Jは、WS-Addressingの場合は「wsa」、WS-SecurityExtensionsの場合は「wsse」などの独自の内部xmlエイリアスで要素を検索したいと考えているようです。これらの名前空間はどちらも実際の応答xmlに存在しないため、例外がスローされます。
C#、. NET、およびSystem.Xml名前空間を使用して、xmlドキュメントをある名前空間のセットから別のセットに変換する簡単な方法があるかどうか疑問に思っています。XmlNamespaceManagerを少し調べましたが、必要なものを完全にはサポートしていないようです...または、少なくとも、本当に役立つ例を見つけることができず、どのように機能するか完全にはわかりません。Java Axis / WSS4Jクライアントによって呼び出されたときにサービスのパフォーマンスに大きな影響を与えたくないので、これを手動で処理するための強力なプロセスを作成する必要がないようにしています。