تحويل بادئات مساحة الاسم XML مع C#؟
سؤال
لقد واجهت مشكلة مزعجة في الحصول على عميل خدمة 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. لا يبدو أن الإصدارات الأحدث لديها هذه المشكلة ، ولم تعد مشكلة.