اتصل بخدمة ويب IIS بدون الملحق .asmx
-
03-07-2019 - |
سؤال
لقد قمت بكتابة خدمة ويب .NET ليستخدمها العميل خارج نطاق سيطرتي (الخادم الخاص بي عبارة عن محاكي لخادم مباشر مكتوب بلغة PHP).تعمل خدمة الويب حسب الرغبة ولكن ليس لدى العميل القدرة على إضافة الامتداد .asmx، أو أي امتداد لهذا الشأن، في مكالماته.يستخدمون بشكل أساسي http://localhost/soap/MyWebService بينما تتوقع IIS http://localhost/soap/MyWebService.asmx.هل هناك أي طريقة لجعل IIS يستجيب للطلبات بدون الملحق .asmx؟
المحلول
وإضافة تعيين البدل، والتي سوف توجيه جميع الطلبات عن طريق ASP.NET:
وستحتاج أيضا إلى القيام ببعض إعادة كتابة URL، للسماح للطلب الوارد http://localhost/soap/MyWebService
لتعيين http://localhost/soap/MyWebService.asmx
.
http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
وفي الأساس، هل يمكن أن تضيف شيئا مثل ما يلي لطريقة Application_BeginRequest
الخاص بك:
string path = Request.Path;
if (path.Contains("/soap/") && !path.EndsWith(".asmx"))
Context.RewritePath(path + ".asmx");
وأنا لم نجرب ذلك (وانها HACK) ولكن يجب أن تبدأ بها.
نصائح أخرى
هل يمكن أيضا وضعه في دليل في حد ذاته، ثم في IIS تعيينه مستند افتراضي.
في الخادم: C: /mywebsite.com/mywebservice/mywebservice.asmx
في وضع IIS mywebservice.asmx كوثيقة الافتراضي
وعلى شبكة الإنترنت: http://mywebsite.com/mywebservice
يبدو لي أن هناك خطأ ما في عميل PHP.ولا ينبغي لهم تفسير عنوان URL الخاص بالخدمة بأي شكل من الأشكال.أيًا كان عنوان URL المحدد في بيانات تعريف الخادم أو تكوين العميل، فهو عنوان URL الذي يجب استخدامه.
لا أعرف PHP، ولكن هل يمكن لأحد أن يخبرني لماذا من المنطقي أن تهتم PHP بعدد النقاط الموجودة في عنوان URL؟لا أستطيع أن أرى أنه من المهم لأي عميل ما إذا كانت خدمتي متاحة أم لا http://localhost/foo/bar أو "http://localhost/foo/b.a.r.asmx?PHP=0".
في فب لديك لاستدعاء اختصار فقط، لا تحتاج إلى asxm أو هذا النوع من الأشياء الغبية التي صافي القيام به.
واحد مثال بسيط
$wsdl = "http://domain/wsdlfile.wsdl"; //url to wsdl
$client = new SoapClient($wsdl,array('trace' => 1,'encoding' => 'UTF-8','exceptions' => 0));
$Return = $client->callfunction();
echo htmlspecialchars($client->__getLastResponse());
وهذا كل شيء.