Java 서비스 클라이언트가 WCF 서비스와 성공적으로 통신하는 데 어려움을 겪고 있습니다. 나는 많은 장애물을 극복했으며, 이것이 나의 마지막 것임을 믿는다. 문제는 Java Axis + WSS4J가 xml 네임 스페이스를 처리하는 방법으로 바뀐다. Java 플랫폼은 xml 네임 스페이스 접두사에 대해 매우 엄격한 것으로 보이며 WCF 응답 메시지를 이해하지 못합니다.XML 네임 스페이스 접두어를 C#으로 변환 하시겠습니까?
간단히 말해서 문제는 다음과 같습니다. 나는 내 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', 'A'에 대한 WS-주소와 같은 대부분의 것들에 대한 간단한 문자 네임 스페이스 접두사를 사용 등 'WS-보안', Java 클라이언트, 즉 WSS4J를위한 'O'는 다음과 같은 기대하는 것 : 내 응답 메시지를 수신하면
<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>
, 자바 클라이언트와 WSS4J는보고 싶은 것 WS-Addressing의 경우 'wsa', WS-Security Extensions의 경우 'wsse'와 같은 자체 xml 별칭으로 구성됩니다. 이 네임 스페이스 중 어느 것도 실제 응답 XML에 존재하지 않으므로 예외가 발생합니다.
C#, .NET 및 System.Xml 네임 스페이스를 사용하여 한 세트의 네임 스페이스 집합에서 XML 문서를 다른 집합으로 변환하는 간단한 방법이 있는지 궁금합니다. XmlNamespaceManager를 조금 훑어 봤지만, 필자가 필요로하는 것을 완벽하게 지원하는 것 같지 않습니다. 또는 적어도, 정말 유용한 예제를 찾을 수 없었고 어떻게 작동하는지 완전히 확신 할 수 없었습니다. Java Axis/WSS4J 클라이언트가 호출 할 때 우리 서비스의 성능에 큰 영향을 미치기를 원하지 않기 때문에, 수동으로 직접 처리하는 중도 프로세스를 작성하지 않아도됩니다.