Bonjour à tous, je poste ici car j'ai un problème avec l'utilisation d'un web service. Je vous explique, le web service en question est très simple: Operations.asmx
<%@ webService Language=C# class=Operations %>
using System.Web.Services;
public class Operations: WebService{
[WebMethod]
public double ajouter(double a, double b){
return a+b;
}
[WebMethod]
public double soustraire(double a, double b){
return a-b;
}
}
Ce fichier est placé dans le répertoire wwwroot. Aucun problème pour utiliser ce service en local en se connectant à http://localhost/Operations.asmx mais lorsque je développe un client SOAP sensé envoyer au serveur IIS les lignes de commandes qui conviennent (recopiées d'un tutorial), j'obtiens un message d'erreur 500 Internal Server Error, je vous copie ici le code de mon client (limité aux lignes envoyées au serveur IIS):
// construction de la chaîne de requête SOAP (2eme methode)
string[] reqSOAP = new string[10];
reqSOAP[0] = "<?xml version=" + "\"1.0\" encoding=\"utf-8\"?>";
reqSOAP[1] = "<soap:Envelope xmlnssi=\"http://www.w3.org/2001/XMLSchema-instance\"xmlnssd=\"http://www.w3.org/2001/XMLSchema\"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
reqSOAP[2] = "<soap:Body>";
reqSOAP[3] = "<" + fonction + " xmlns=\"http://tempuri.org/\">";
reqSOAP[4] = "<a>" + a + "</a>";
reqSOAP[5] = "<b>" + b + "</b>";
reqSOAP[6] = "</" + fonction + ">";
reqSOAP[7] = "</soap:Body>";
reqSOAP[8] = "</soap:Envelope>";
reqSOAP[9] = "";
int nbCharsSOAP = 0;
for (int i = 0; i < 10; i++) {
nbCharsSOAP += reqSOAP[i].Length;
Console.WriteLine("longueur " + i + ": "+ nbCharsSOAP);
}
// construction du tableau des entêtes HTTP à envoyer
string[] entetes=new string[6];
entetes[0]="POST " + "/Operations.asmx"+" HTTP/1.1";
entetes[1] = "Host: " + host; // +":" + uri.Port;
entetes[2]="Content-Type: text/xml; charset=utf-8";
entetes[3]="Content-Length: "+nbCharsSOAP;
entetes[4] = "SOAPAction: \"http://tempuri.org/" + fonction + "\"";
entetes[5]="";
// on envoie les entêtes HTTP au serveur
for(int i=0;i<entetes.Length;i++){
// envoi au serveur
OUT.WriteLine(entetes[i]);
// écho écran
Console.Out.WriteLine("--> "+entetes[i]);
}//for
// on lit la 1ere réponse du serveur Web HTTP/1.1 100
string ligne=null; // une ligne du flux de lecture
while((ligne=IN.ReadLine())!=""){
//écho
Console.Out.WriteLine("<-- "+ligne);
}//while
//écho dernière ligne
Console.Out.WriteLine("<-- "+ligne);
// on envoie les entêtes HTTP au serveur
for (int i = 0; i < reqSOAP.Length; i++)
{
// envoi au serveur
OUT.WriteLine(reqSOAP[i]);
// écho écran
Console.Out.WriteLine("--> " + reqSOAP[i]);
}//for
Voici l'échange de message:
--> POST /Operations.asmx/ajouter HTTP/1.1
--> Host: 10.23.149.71
--> Content-Type: text/xml; charset=utf-8
--> Content-Length: 297
--> SOAPAction: "localhost/ajouter"
-->
<-- HTTP/1.1 100 Continue
<-- Server: Microsoft-IIS/5.1
<-- Date: Fri, 23 May 2008 07:44:05 GMT
<-- X-Powered-By: ASP.NET
<--
--> <?xml version="1.0" encoding="utf-8"?>
--> <soap:Envelope xmlnssi="http://www.w3.org/2001/XMLSchema-instance"xmlnss
d="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/soap/
envelope/">
--> <soap:Body>
--> <ajouter xmlns="localhost">
--> <a>1</a>
--> <b>2</b>
--> </ajouter>
--> </soap:Body>
--> </soap:Envelope>
-->
<-- HTTP/1.1 500 Internal Server Error
<-- Server: Microsoft-IIS/5.1
<-- Date: Fri, 23 May 2008 07:44:35 GMT
<-- X-Powered-By: ASP.NET
<-- X-AspNet-Version: 2.0.50727
<-- Cache-Control: private
<-- Content-Type: text/xml; charset=utf-8
<-- Content-Length: 430
<--
<-- <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://sche
mas.xmlsoap.org/soap/envelope/" xmlnssi="http://www.w3.org/2001/XMLSchema-inst
ance" xmlnssd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><fault
code>soap:Client</faultcode><faultstring>Le serveur n'a pas reconnu la valeur de
l'en-tête HTTP SOAPAction : localhost/ajouter.</faultstring><detail /></soap:Fa
ult></soap:Body></soap:Envelope>
[résultat=?]
Je ne comprend vraiment pas pourquoi ca ne fonctionne pas, j'ai suivi un tuto à la lettre. Si quelqu'un gère bien les web services, le soap etc... je suis preneur de toute aide ou conseils avisés , merci beaucoup!!
Bonne journée
J'ai oublié de préciser que mon serveur IIS est de version 5.1 et mon framework .NET est de version 3.5
J'ai essayé de mettre "http://tempuri.org/"+fonction à la place de localhost, j'ai alors une erreur 400 bad request, cela ne m'avance pas beaucoup...
Merci de votre aide
Partager