web-dev-qa-db-fra.com

Comment envoyer / recevoir SOAP demande et réponse en utilisant C #?

private static string WebServiceCall(string methodName)        
{
    WebRequest webRequest = WebRequest.Create("http://localhost/AccountSvc/DataInquiry.asmx");
    HttpWebRequest httpRequest = (HttpWebRequest)webRequest;             
    httpRequest.Method = "POST";             
    httpRequest.ContentType = "text/xml; charset=utf-8";
    httpRequest.Headers.Add("SOAPAction: http://tempuri.org/" + methodName);
    httpRequest.ProtocolVersion = HttpVersion.Version11;
    httpRequest.Credentials = CredentialCache.DefaultCredentials;
    Stream requestStream = httpRequest.GetRequestStream();              
    //Create Stream and Complete Request             
    StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.ASCII);

    StringBuilder soapRequest = new StringBuilder("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
    soapRequest.Append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ");
    soapRequest.Append("xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>");
    soapRequest.Append("<GetMyName xmlns=\"http://tempuri.org/\"><name>Sam</name></GetMyName>");
    soapRequest.Append("</soap:Body></soap:Envelope>");

    streamWriter.Write(soapRequest.ToString());             
    streamWriter.Close();              
    //Get the Response    
    HttpWebResponse wr = (HttpWebResponse)httpRequest.GetResponse();
    StreamReader srd = new StreamReader(wr.GetResponseStream()); 
    string resulXmlFromWebService = srd.ReadToEnd(); 
    return resulXmlFromWebService;
}

J'ai essayé un code différent pour envoyer/recevoir des réponses de savon, mais tous échouent avec la même "The remote server returned an error: (500) Internal Server Error.".

Je peux accéder au même service en utilisant SoapUI. Je peux également invoquer la méthode. J'ai lu dans ce forum que la raison pour laquelle je reçois une erreur de 500 pourrait être un en-tête erroné. J'ai vérifié l'en-tête, il semble être correct. J'apprécierais si quelqu'un peut aider.

Voici l'exemple SOAP request:

POST /AccountSvc/DataInquiry.asmx HTTP/1.1
Host: abc.def.gh.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/GetMyName"

<?xml version="1.0" encoding="utf-8"?>
<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/">
  <soap:Body>
    <GetMyName xmlns="http://tempuri.org/">
      <name>string</name>
    </GetMyName>
  </soap:Body>
</soap:Envelope>

J'ai utilisé l'exemple de demande ci-dessus pour exécuter la méthode et cela a fonctionné. Voici la demande Soap que j'ai passée:

<?xml version="1.0" encoding="utf-8"?><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/"><soap:Body><GetMyName xmlns="http://tempuri.org/"><name>Sam</name></GetMyName></soap:Body></soap:Envelope>

Modifier:

J'ai mis à jour le code ci-dessus dans WebServiceCall qui fonctionnait pour le service .asmx. Mais le même code ne fonctionnait pas pour le service WCF. Pourquoi?

22
Sri Reddy

Les URL sont différentes.

  • http://localhost/AccountSvc/DataInquiry.asmx

vs.

  • /acctinqsvc/portfolioinquiry.asmx

Résolvez d'abord ce problème, comme si le serveur Web ne peut pas résoudre l'URL que vous essayez de POST to, vous ne commencerez même pas à traiter les actions décrites par votre demande.

Vous ne devez créer que la demande Web vers l'URL racine ASMX, c'est-à-dire: http://localhost/AccountSvc/DataInquiry.asmx, et spécifiez la méthode/opération souhaitée dans l'en-tête SOAPAction.

Les valeurs d'en-tête SOAPAction sont différentes.

  • http://localhost/AccountSvc/DataInquiry.asmx/ + methodName

vs.

  • http://tempuri.org/GetMyName

Vous devriez pouvoir déterminer la SOAPAction correcte en accédant à l'URL ASMX correcte et en ajoutant ?wsdl

Il devrait y avoir un <soap:operation> tag sous le <wsdl:operation> balise correspondant à l'opération que vous tentez d'exécuter, qui semble être GetMyName.

Il n'y a pas de déclaration XML dans le corps de la demande qui inclut votre SOAP XML.

Vous spécifiez text/xml dans le ContentType de votre HttpRequest et sans charset. Peut-être que ces valeurs par défaut sont us-ascii, mais on ne sait pas si vous ne les spécifiez pas!

Le XML créé par SoapUI comprend une déclaration XML qui spécifie un codage de utf-8, qui correspond également au type de contenu fourni à la demande HTTP qui est: text/xml; charset=utf-8

J'espère que ça t'as aidé!

21
rrhartjr