Problème client SOAP [Résolu]

Signaler
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
15 septembre 2008
-
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
15 septembre 2008
-
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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="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 + "";
reqSOAP[5] = " " + 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 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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xs
d="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/soap/
envelope/">
--> <soap:Body>
-->
--> 1
--> 2
-->
--> </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/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst
ance" xmlns:xsd="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

5 réponses

Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
15 septembre 2008

J'ai résolu mon problème, il suffit d'envoyer les requetes soap en un bloc et non pas ligne par ligne, je concatène donc les différentes lignes dans un string que j'envoie au serveur IIS et magie, ca fonctionne.

Si quelqu'un a des problèmes avec l'utilisation manuelle de web services, n'hésitez pas à me contacter, je serais peut être en mesur de vous aider

Bye
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
15 septembre 2008

J'ai oublié de préciser que mon serveur IIS est de version 5.1 et mon framework .NET est de version 3.5

Voilà
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
15 septembre 2008

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...
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
une raison particulière au fait que tu fasse le client a la main alors que .NET gère tout ca (et cest fait pour) et que le coté webservice service serait alors totalement transparent dans ton appli?
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
15 septembre 2008

En fait, je dois pouvoir communiquer avec une machine en respectant une syntaxe bien particulière (que je connais en ayant réalisé une capture de trames avec Wireshark) et je pense que pour mon application, il est plus facile d'envoyer les données ligne par ligne en respectant la syntaxe que de tenter d'écrire un web service qui devrait la respecter.

Bonne journée