سؤال

لدي خدمة ويب ASP.NET على غرار:

[WebService(Namespace = "http://internalservice.net/messageprocessing")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class ProvisioningService : WebService
{
    [WebMethod]
    public XmlDocument ProcessMessage(XmlDocument message)
    {
        // ... do stuff
    }
}

أقوم بالاتصال بخدمة الويب من ASP باستخدام شيء مثل:

provWSDL = "http://servername:12011/MessageProcessor.asmx?wsdl"
Set service = CreateObject("MSSOAP.SoapClient30")
service.ClientProperty("ServerHTTPRequest") = True
Call service.MSSoapInit(provWSDL)

xmlMessage = "<request><task>....various xml</task></request>"
result = service.ProcessMessage(xmlMessage)

المشكلة التي أواجهها هي أنه عندما يصل XML إلى طريقة ProcessMessage، أضافت شبكة خدمة الويب مساحة اسم افتراضية على طول الطريق.أي.إذا قمت بتعيين نقطة توقف داخل ProcessMessage (رسالة XmlDocument) أرى:

<request xmlns="http://internalservice.net/messageprocessing">
  <task>....various xml</task> 
</request>

عندما أقوم بالتقاط حزم على السلك، أستطيع أن أرى أن ملف XML الذي تم إرساله بواسطة مجموعة أدوات SOAP يختلف قليلاً عن ذلك الذي أرسله عميل .NET WS.ترسل مجموعة أدوات SOAP:

<SOAP-ENV:Envelope 
    xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <ProcessMessage xmlns="http://internalservice.net/messageprocessing">
            <message xmlns:SOAPSDK4="http://internalservice.net/messageprocessing">
                <request>
                    <task>...stuff to do</task>
                </request>
            </message>
        </ProcessMessage>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

بينما يرسل عميل .NET:

<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <ProcessMessage xmlns="http://internalservice.net/messageprocessing">
            <message>
                <request xmlns="">
                    <task>...stuff to do</task>
                </request>
            </message>
        </ProcessMessage>
    </soap:Body>
</soap:Envelope>

لقد مر وقت طويل منذ أن استخدمت مجموعة أدوات ASP/SOAP للاتصال بخدمات الويب .NET، ولا أستطيع تذكر كل الحيل الذكية/SOAP-fu التي استخدمتها للالتفاف حول أشياء مثل هذه.

أيه أفكار؟أحد الحلول هو إنشاء وكيل .NET قابل للاستدعاء من COM والذي يأخذ XML كمعلمة سلسلة ويستدعي WS نيابةً عني، ولكنها طبقة إضافية من التعقيد/العمل الذي كنت أتمنى عدم القيام به.

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

المحلول 3

لقد حللت هذا:

عميل الصابون طلب كانت العقدة تلتقط مساحة الاسم الافتراضية من:

<ProcessMessage xmlns="http://internalservice.net/messageprocessing">

تؤدي إضافة مساحة اسم افتراضية فارغة إلى ملف XML الذي يرسله عميل ASP إلى تجاوز هذا السلوك:

xmlMessage = "<request xmlns=''><task>....various xml</task></request>"

نصائح أخرى

كيف,

لقد وجدت الحل، لكنه ليس تافها.

تحتاج إلى إنشاء تطبيق مخصص لـ IHeaderHandler يقوم بإنشاء الرؤوس المناسبة.

هناك خطوة جيدة خطوة هنا:

http://msdn.microsoft.com/en-us/library/ms980699.aspx

يحرر:رأيت التحديث الخاص بك.حل بديل لطيف، قد ترغب في وضع إشارة مرجعية على هذا الرابط بغض النظر عن :D

أعتبر أن لديك حق الوصول إلى رمز الخدمات، وليس فقط العميل المستهلك، أليس كذلك؟

ما عليك سوى سحب مساحة الاسم من XmlDocument باعتبارها الجزء الأول من الطريقة.

شيء مثل:

XmlDocument changeDocumentNamespace(XmlDocument doc, string newNamespace) 
{   
    if (doc.DocumentElement.NamespaceURI.Length > 0) 
    {
        doc.DocumentElement.SetAttribute("xmlns", newNameSpace);
        XmlDocument newDoc = new XmlDocument();
        newDoc.LoadXml(doc.OuterXml);
        return newDoc;
    }
    else 
    {
        return doc;
    }
}

ثم:

[WebService(Namespace = "http://internalservice.net/messageprocessing")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class ProvisioningService : WebService
{
    [WebMethod]
    public XmlDocument ProcessMessage(XmlDocument message)
    {
        message = changeDocumentNamespace(message,String.Empty);
        // Do Stuff...
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top