2009-03-04 11 views
3

J'ai écrit un service Web .NET qui doit être utilisé par un client hors de mon contrôle (mon serveur est un simulateur pour un serveur en direct écrit en PHP). Le service Web fonctionne comme vous le souhaitez, mais le client n'a pas la possibilité d'ajouter l'extension .asmx, ou toute extension d'ailleurs, dans ses appels. Ils utilisent essentiellement http://localhost/soap/MyWebService tandis que IIS attend http://localhost/soap/MyWebService.asmx. Est-il possible de faire répondre IIS aux demandes sans l'extension .asmx?Appeler un service Web IIS sans l'extension .asmx

Répondre

7

Ajouter un mappage générique, qui acheminera toutes les demandes par ASP.NET:

http://professionalaspnet.com/archive/2007/07/27/Configure-IIS-for-Wildcard-Extensions-in-ASP.NET.aspx

Vous aurez également besoin de faire un peu de réécriture d'URL, pour permettre à la requête entrante http://localhost/soap/MyWebService à la carte à http://localhost/soap/MyWebService.asmx.

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

Fondamentalement, vous pouvez ajouter quelque chose comme ce qui suit à votre méthode Application_BeginRequest:

string path = Request.Path; 
if (path.Contains("/soap/") && !path.EndsWith(".asmx")) 
    Context.RewritePath(path + ".asmx"); 

Je ne l'ai pas testé (et il est un HACK) mais il devrait vous aider à démarrer.

+0

Bien que cette solution fonctionne, elle ne fonctionne que sur les systèmes exécutant IIS 6 ou supérieur. – jercra

+0

Il est possible d'ajouter un mappage générique à IIS 5.x, mais les étapes sont différentes. – Brannon

+0

Oui, vous pouvez ajouter un mappage générique à IIS 5.x mais il y a un bogue quand il s'agit de service Web dans lequel vous obtiendrez une erreur sur le verbe ne pas être autorisé. Le bug est plutôt bien noté sur les forums ASP.net. – jercra

4

Vous pouvez également le placer dans un répertoire, puis dans IIS le définir comme document par défaut.

Sur le serveur: C: /mywebsite.com/mywebservice/mywebservice.asmx

Dans IIS défini mywebservice.asmx comme document par défaut

Sur le web: http://mywebsite.com/mywebservice

+0

J'ai essayé cela et cela n'a pas fonctionné. – jercra

0

Il me semble qu'il y a quelque chose de très mauvais avec le client PHP. Ils ne doivent en aucun cas interpréter l'URL du service. Quelle que soit l'URL spécifiée dans les métadonnées du serveur ou dans la configuration du client, il s'agit de l'URL à utiliser.

Je ne connais pas PHP, mais quelqu'un peut-il me dire pourquoi il est logique que PHP prenne soin de combien de points il y a dans une URL? Je ne peux pas voir que cela devrait importer à n'importe quel client si mon service est au http://localhost/foo/bar ou "http://localhost/foo/b.a.r.asmx?PHP=0".

+0

Le problème n'est pas que PHP se soucie du nombre de points qu'il y a. C'est que le client PHP n'est pas sous mon contrôle et l'adresse est codée en dur à http: // localhost/foo/bar et IIS attend http: //localhost/foo/bar.asmx. J'avais besoin d'IIS pour comprendre que les requêtes sans .asmx devraient toujours être traitées. – jercra

+0

Cela commence à confirmer ma conviction pourquoi dans le monde serait-il une bonne idée pour tout client d'un service Web ou d'une autre ressource de coder en dur l'URL ??? Les URL changent. Ils devraient prendre l'URL d'un magasin de configuration. –

0

En php vous devez appeler le wsdl seulement, vous n'avez pas besoin de l'asxm ou ce genre de choses stupides que .net faire.

un exemple simple

$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()); 

qui est tout.

+2

Pardonnez-moi, mais pas même PHP peut appeler un WSDL. Un WSDL décrit simplement le service que PHP appellera plus tard. Le WSDL contiendra généralement l'URL du service réel, qui sera le stupide fichier .asmx. –

Questions connexes