Problème client SOAP [Résolu]

Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Dernière intervention
15 septembre 2008
- - Dernière réponse : cs_thibault57
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Dernière intervention
15 septembre 2008
- 2 juin 2008 à 13:20
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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Dernière intervention
15 septembre 2008
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_thibault57
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Dernière intervention
15 septembre 2008
0
Merci
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à
Commenter la réponse de cs_thibault57
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Dernière intervention
15 septembre 2008
0
Merci
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...
Commenter la réponse de cs_thibault57
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
0
Merci
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?
Commenter la réponse de leprov
Messages postés
5
Date d'inscription
lundi 4 décembre 2000
Dernière intervention
15 septembre 2008
0
Merci
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
Commenter la réponse de cs_thibault57

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.