سؤال

لقد واجهت مشكلة مزعجة في الحصول على عميل خدمة Java للتواصل بنجاح مع خدمة WCF. لقد تغلبت على العديد من العقبات ، وأعتقد أن هذه هي الأخيرة. تتلخص المشكلة في كيفية يبدو أن Java Axis + WSS4J تتعامل مع مساحات أسماء XML. يبدو أن منصة Java صلبة للغاية فيما يتوقعونه لبادئات مساحة اسم XML ، وعلى هذا النحو ، لا تفهم رسائل رد WCF.

مشكلتي باختصار هي كما يلي. لدي استجابة XML مماثلة لما يلي من خدمة 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>

تستخدم هذه الاستجابة بادئات مساحة الأسماء البسيطة من أحادية الشحنة لمعظم الأشياء ، مثل "S" لمظروف الصابون "،" A "لـ WS-Addressing ،" O "لـ" WS-Security "، إلخ. عميل 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 يرغبان في البحث عن عناصر من خلال الأسماء المستعارة الخاصة بـ XML الخاصة بهما ، مثل "WSA" لـ WS-Addressing ، و "WSSE" لتمديدات WS-Security. نظرًا لعدم وجود أي من مساحات الأسماء هذه في الاستجابة الفعلية XML ، يتم طرح الاستثناءات.

أتساءل عما إذا كانت هناك طريقة بسيطة لتحويل مستند XML من مجموعة من مساحات الأسماء إلى مجموعة أخرى باستخدام مساحة الاسم C#و .NET و System.xml. لقد تجولت مع XmlNamesPacemanager قليلاً ، لكن لا يبدو أنها تدعم تمامًا ما أحتاجه ... أو على الأقل ، لم أتمكن من العثور على أي أمثلة مفيدة حقًا ، وأنا لست متأكدًا تمامًا من كيفية عمله. أحاول تجنب الاضطرار إلى كتابة بعض العمليات الشاقة للتعامل مع هذا نفسي يدويًا ، لأنني لا أرغب في التأثير بشكل كبير على أداء خدماتنا عند استدعاؤه بواسطة عميل Java Axis/WSS4J.

هل كانت مفيدة؟

المحلول

يبدو أن هذه المشكلة بالذات تنبع من نسخة قديمة وعربات التي تجرها الدواب من WSS4J. لا يبدو أن الإصدارات الأحدث لديها هذه المشكلة ، ولم تعد مشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top