2010-03-28 1 views
0

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 클라이언트가 호출 할 때 우리 서비스의 성능에 큰 영향을 미치기를 원하지 않기 때문에, 수동으로 직접 처리하는 중도 프로세스를 작성하지 않아도됩니다.

답변

0

이 특정 문제는 이전 버전의 버그가있는 WSS4J 버전에서 비롯된 것으로 보입니다. 최신 버전에는이 문제가없는 것 같으며 더 이상 문제가되지 않습니다.