Domanda

Ho eseguito in un problema di esasperante ottenere un client di servizio Java per comunicare con successo con un servizio WCF. Ho superato molti ostacoli, e credo che questo è il mio ultimo. Il problema si riduce a come Java Asse + WSS4J sembrano gestire namespace XML. La piattaforma Java sembra essere molto rigida in ciò che si aspettano per i prefissi di namespace XML, e come tale, non capiscono la WCF messaggi di risposta.

Il mio problema in poche parole è il seguente. Ho una risposta XML simile al seguente dal mio servizio 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>

Questa risposta utilizza semplici prefissi di namespace di un carattere per la maggior parte delle cose, come la 's' per SOAP Envelope, 'a' per WS-Addressing, 'o' per 'WS-Security', ecc Il client Java, vale a dire WSS4J, sembra aspettarsi il seguente:

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

Dopo aver ricevuto il mio messaggio di risposta, il client Java e WSS4J sembrano voler cercare gli elementi per i propri alias XML interne, come ad esempio 'WSA' per WS-Addressing, e 'wsse' per WS-Security Extensions. Dal momento che nessuno di quegli spazi sono presenti nel xml risposta effettiva, vengono generate eccezioni.

Mi chiedo se non v'è alcun modo semplice per trasformare un documento XML da un insieme di spazi dei nomi per un altro set in C #, .NET e lo spazio dei nomi System.Xml. Ho curiosato con XmlNamespaceManager un po ', ma non sembra per supportare pienamente quello che mi serve ... o per lo meno, sono stato in grado di trovare alcun esempio realmente utili, e non sono completamente sicuro di come funziona. Sto cercando di evitare di dover scrivere qualche processo pesanti per gestire manualmente me, come io non voglio influenzare drasticamente le prestazioni dei nostri servizi quando viene chiamato da un client Java Axis / WSS4J.

È stato utile?

Soluzione

Questo particolare problema sembrava derivare da un vecchio e buggy versione di WSS4J. Le versioni più recenti non sembrano avere questo problema, e non è più un problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top