Frage

Ich habe in ein ärgerlichen Problem führt ein Java-Service-Client immer erfolgreich mit einem WCF-Dienst zu kommunizieren. Ich habe viele Hürden zu überwinden, und ich glaube, dass dies meine letzte ist. Das Problem läuft darauf hinaus, wie Java-Achse + WSS4J scheint XML-Namespaces zu behandeln. Die Java-Plattform scheint sehr steif zu sein in dem, was sie für xml Namespacepräfixe erwarten, und als solche, nicht verstehen, die WCF Antwortnachricht.

Mein Problem auf den Punkt folgt, wird als. Ich habe eine XML-Antwort ähnlich der folgenden aus meinem WCF-Dienst:

<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>

Diese Antwort verwendet einfaches Ein-Zeichen Namespacepräfixe für die meisten Dinge, wie 's' für SOAP-Umschlag, 'a' für WS-Addressing, 'o' für 'WS-Security' usw. Die Java-Client, nämlich WSS4J, scheint die folgende erwarten:

<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>

Nach Erhalt meiner Antwortnachricht, das Java-Client und WSS4J scheinen durch ihre eigenen internen XML-Aliasnamen, wie ‚wsa‘ für WS-Addressing, und ‚wsse‘ für WS-Security Extensions nachschlagen Elemente zu wollen. keines dieser Namensräume Da sind in der tatsächlichen Reaktion xml, werden Ausnahmen ausgelöst.

Ich frage mich, ob es eine einfache Möglichkeit, ein XML-Dokument aus einer Reihe von Namensräumen auf einem anderen Satz mit C #, .NET und dem Namespace System.Xml zu transformieren. Ich habe mit XmlNamespaceManager ein bisschen stochert, aber es scheint nicht voll zu unterstützen, was ich brauche ... oder zumindest, ich habe es nicht gelungen, alle wirklich nützliche Beispiele zu finden, und ich bin nicht ganz sicher, wie es funktioniert. Ich versuche zu vermeiden, einigen schweren Prozess zu schreiben, diese selbst manuell zu handhaben, wie ich will nicht drastisch die Leistung unserer Dienste auswirken, wenn sie von einem Java-Achse / WSS4J Client aufgerufen.

War es hilfreich?

Lösung

Dieses besondere Problem schien aus einer alten und Buggy-Version von WSS4J einzudämmen. Neuere Versionen scheinen nicht, dieses Problem zu haben, und es ist kein Thema mehr.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top