كيف أقوم بتنسيق الرسالة المستخدمة لتنفيذ منشور HTTP من VBScript/ASP إلى خدمة WCF والحصول على استجابة؟

StackOverflow https://stackoverflow.com/questions/76925

  •  09-06-2019
  •  | 
  •  

سؤال

القيام بهذا المنشور ليس هو المشكلة!تنسيق الرسالة حتى أحصل على رد هو المشكلة.

من الناحية المثالية، سأكون قادرًا على إنشاء رسالة واستخدام WinHTTP لإجراء منشور على خدمة WCF (المستضافة في IIS) والحصول على رد، ولكن حتى الآن لم أتمكن من إنشاء شيء يعمل بشكل صحيح.

هل لدى أي شخص مثال واضح للقيام بذلك؟

في عالم خدمة الويب 2.0، كان الأمر سهلاً مثل وضع الإعداد في web.config لجعل الخدمة تستجيب لمنشور ثم استدعاء طريقة الويب المناسبة باستخدام المعلمات الصحيحة.يبدو أنه لا يوجد مثيل لهذا في عالم WCF.

حتى الآن لا يوجد خيار بالنسبة لي لتحويل المستهلك (نهاية vbscript) إلى .NET.

افترض في هذه المرحلة أنه في نقطة النهاية يمكنني التحويل لاستخدام أي روابط متاحة حتى كل ما هو مدعوم في .NET 3.5، ولكن في نفس الوقت إذا كان من الممكن القيام بذلك باستخدام WsHttpBinding أو BasicHttpBinding فإن ​​الإجابة الصحيحة على ذلك ستكون لوصف كيفية تنسيق الرسالة لأي من تلك الارتباطات في سياق VBScript أو إذا لم تكن هناك طريقة للقيام بذلك، فقل فقط، لا يمكنك القيام بذلك.إذا كان من الممكن القيام بذلك باستخدام WebHTTPBinding، فلن أجد طريقة لتحقيق ذلك لأنني قمت بالفعل بالتحقق من سمة WebInvoce ولم أتمكن من إنشاء اختبار من VBScript إلى WCF يعمل بشكل صحيح.

افترض أن نوع البيانات المنشورة عبارة عن سلسلة وأن الاستجابة عبارة عن سلسلة أيضًا.

كما أن هذا السؤال لا يتعلق بـ WinHTTP.أعرف بالفعل كيفية إجراء المنشور باستخدام WinHTTP، فهو بناء الرسالة التي ستستجيب لها خدمة WCF، وهذه هي المشكلة.

بينما يمكنني استخدام شيء آخر غير WinHTTP لإجراء النشر من ASP إلى خدمة WCF مثل XMLHTTP، لا يزال لدي مشكلة في إنشاء رسالة XML ستستجيب لها خدمة WCF.لقد جربت أشكالًا مختلفة من هذا وما زلت غير قادر على فهم نوع التنسيق الذي أحتاج إلى استخدامه لتحقيق ذلك.

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

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

المحلول

أنت لا تحدد شيئًا واحدًا:ما هو الالتزام الذي تعرض به خدمتك؟إذا كنت تستخدم WsHttpBinding أو BasicHttpBinding، فلن يكون هناك "منشور http" بسيط يمكنك القيام به، لأنك تحتاج إلى تضمين مظروف SOAP بالكامل على الأقل (مع إصدار SOAP الصحيح ورؤوس الأمان المحتملة وما إلى ذلك).

إذا كنت تستخدم (أو يمكنك الانتقال إلى) .NET 3.5، فهناك ربط جديد تم إنشاؤه بشكل صريح لدعم سيناريوهات مثل هذه، حيث تريد أن يتم عرض خدمتك ليس كخدمة SOAP ولكن كخدمة تشبه REST تمامًا، أو ببساطة مثل XML/JSON عبر HTTP.يطلق عليه WebHttpBinding.

هناك العديد من الخيارات التي يمكنك تعديلها، ولكن من المحتمل جدًا أنك قد تتمكن من إضافة نقطة نهاية جديدة باستخدام webHttpBinding وتشغيل ذلك على الفور تقريبًا.

قد يمنحك هذا بداية قوية لنموذج البرمجة الجديد: http://msdn.microsoft.com/en-us/library/bb412169.aspx

نصائح أخرى

لقد كتبت بعض التعليمات البرمجية منذ فترة لماكرو Excel الذي يقرأ ملف XML وينشر المحتويات على عنوان URL ثم يحفظ النتيجة.

Sub ExportToHTTPPOST()
Dim sURL, sExtraParams
Const ForReading = 1, ForWriting = 2, ForAppending = 3

Set rs = CreateObject("Scripting.FileSystemObject")
Set r = rs.OpenTextFile("y:\test.xml", ForReading)

Set Ws = CreateObject("Scripting.FileSystemObject")
Set w = Ws.OpenTextFile("Y:\test2.xml", ForWriting, True)

Do Until r.AtEndOfStream

    sData = sData & r.readline

Loop

sURL = "http://MyServer/MyWebApp.asp"

sData = "payload=" & sData

    Set objHTTP = New WinHttp.WinHttpRequest

            objHTTP.Open "POST", sURL, False
            objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
            objHTTP.send sData
            w.writeline objHTTP.ResponseText
    Set objHTTP = Nothing
    w.Close
    r.Close
End Sub

هذا هو أبسط رمز لدي للقيام بنشر HTTP في الخلفية في ASP

Set objXML = CreateObject("MSXML2.ServerXMLHTTP.6.0")
objXML.open "POST", url, false
objXML.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objXML.send("key="& Server.URLEncode(xmlvalue))
Set responseXML = objXML.responseXML
Set objXML = nothing

يتطلب هذا فقط تثبيت كائنات MSXML على الخادم الخاص بك.أستخدم هذا لجميع أنواع الأشياء بما في ذلك خادم/عميل XML-RPC في ASP.

يحرر:أعد قراءة سؤالك وإذا كنت مستعدًا لهذه الطريقة المحددة، فلن يساعدك ذلك، ولكن إذا كنت تبحث حقًا عن طريقة للوصول إلى خدمة الويب الخاصة بك، فسيعمل هذا طالما أنك تقوم بإنشاء XML الخاص بك للنشر بشكل صحيح.

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