Вызов веб-службы 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");
Я не тестировал его (и это ХАК), но он должен помочь вам начать.
Другие советы
Вы также можете поместить его в отдельный каталог, а затем в IIS установить его как документ по умолчанию.
На сервере:C:/mywebsite.com/mywebservice/mywebservice.asmx
В IIS установите mywebservice.asmx в качестве документа по умолчанию.
В интернете: http://mywebsite.com/mywebservice
Мне кажется, что с PHP-клиентом что-то не так.Они не должны каким-либо образом интерпретировать URL-адрес службы.Какой бы URL-адрес ни был указан в метаданных сервера или конфигурации клиента, им следует использовать именно тот URL-адрес.
Я не знаю PHP, но может ли кто-нибудь сказать мне, почему PHP имеет смысл заботиться о том, сколько точек в URL-адресе?Я не понимаю, что для любого клиента должно иметь значение, находится ли мое обслуживание на высоком уровне. http://localhost/foo/бар или "http://localhost/foo/b.a.r.asmx?PHP=0".
В php вам нужно вызывать только wsdl, вам не нужен asxm или другие глупые вещи, которые делает .net.
один простой пример
$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());
вот и все.