Chiamare un servizio Web IIS senza l'estensione .asmx
-
03-07-2019 - |
Domanda
Ho scritto un servizio Web .NET che deve essere utilizzato da un client al di fuori del mio controllo (il mio server è un simulatore per un server live scritto in PHP). Il servizio Web funziona come desiderato, ma il client non ha la possibilità di aggiungere l'estensione .asmx o qualsiasi estensione del caso, nelle loro chiamate. Fondamentalmente usano http: // localhost / soap / MyWebService mentre IIS si aspetta http: //localhost/soap/MyWebService.asmx . Esiste un modo per far rispondere IIS alle richieste senza l'estensione .asmx?
Soluzione
Aggiungi un mapping jolly, che indirizzerà tutte le richieste tramite ASP.NET:
Dovrai anche riscrivere l'URL, per consentire alla richiesta in arrivo http: // localhost / soap / MyWebService
di mappare su http: // localhost / soap / MyWebService .asmx
.
http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
Fondamentalmente, potresti aggiungere qualcosa come il seguente al tuo metodo Application_BeginRequest
:
string path = Request.Path;
if (path.Contains("/soap/") && !path.EndsWith(".asmx"))
Context.RewritePath(path + ".asmx");
Non l'ho provato (ed è un HACK) ma dovrebbe iniziare.
Altri suggerimenti
Potresti anche inserirlo in una directory da solo, quindi in IIS impostarlo come documento predefinito.
Sul server: C: /mywebsite.com/mywebservice/mywebservice.asmx
In IIS impostare mywebservice.asmx come documento predefinito
Sul web: http://mywebsite.com/mywebservice
Mi sembra che ci sia qualcosa di molto sbagliato nel client PHP. Non dovrebbero interpretare l'URL del servizio in alcun modo. Qualunque URL sia specificato nei metadati del server o nella configurazione client è l'URL che dovrebbero usare.
Non conosco PHP, ma qualcuno può dirmi perché ha senso che a PHP importi quanti punti ci sono in un URL? Non riesco a vedere che dovrebbe interessare qualsiasi cliente se il mio servizio è disponibile all'indirizzo http: // localhost / foo / bar o " http: // localhost / foo / barasmx? PHP = 0 ".
In php devi chiamare solo il wsdl, non hai bisogno dell'asm o di quel tipo di cose stupide che fanno .net.
un semplice esempio
$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());
tutto qui.