cs_thibault57
Messages postés5Date d'inscriptionlundi 4 décembre 2000StatutMembreDernière intervention15 septembre 2008
-
23 mai 2008 à 09:53
cs_thibault57
Messages postés5Date d'inscriptionlundi 4 décembre 2000StatutMembreDernière intervention15 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
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!!
cs_thibault57
Messages postés5Date d'inscriptionlundi 4 décembre 2000StatutMembreDernière intervention15 septembre 2008 2 juin 2008 à 13:20
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
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 23 mai 2008 à 12:02
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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_thibault57
Messages postés5Date d'inscriptionlundi 4 décembre 2000StatutMembreDernière intervention15 septembre 2008 26 mai 2008 à 08:48
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.