2009-11-25 4 views
12

J'essaye de composer un message SOAP (y compris l'en-tête) dans C# .NET pour l'envoyer à une URL en utilisant le message HTTP. L'adresse URL à laquelle je veux l'envoyer n'est pas un service web, elle reçoit juste des messages SOAP pour finalement en extraire des informations. auriez vous des idées pour faire ça?Objet SOAP sur un message HTTP en C# .NET

Répondre

15

Vous devez d'abord créer un fichier XML valide. J'utilise LINQ to XML pour y parvenir, comme suit:

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/"; 
var document = new XDocument(
       new XDeclaration("1.0", "utf-8", String.Empty), 
       new XElement(soapenv + "Envelope", 
        new XAttribute(XNamespace.Xmlns + "soapenv", soapenv), 
        new XElement(soapenv + "Header", 
         new XElement(soapenv + "AnyOptionalHeader", 
          new XAttribute("AnyOptionalAttribute", "false"), 
         ) 
        ), 
        new XElement(soapenv + "Body", 
         new XElement(soapenv + "MyMethodName", 
          new XAttribute("AnyAttributeOrElement", "Whatever") 
         ) 
        ) 
       ); 

Puis-je l'envoyer à l'aide (EDIT:. Ajouté XDocument.ToString() ici)

  var req = WebRequest.Create(uri); 
      req.Timeout = 300000; //timeout 
      req.Method = "POST"; 
      req.ContentType = "text/xml;charset=UTF-8"; 

      using (var writer = new StreamWriter(req.GetRequestStream())) 
      { 
       writer.WriteLine(document.ToString()); 
       writer.Close(); 
      } 

Si je dois lire une réponse, Je ne (ce qui est suivi du code ci-dessus):

  using (var rsp = req.GetResponse()) 
      { 
       req.GetRequestStream().Close(); 
       if (rsp != null) 
       { 
        using (var answerReader = 
           new StreamReader(rsp.GetResponseStream())) 
        { 
         var readString = answerReader.ReadToEnd(); 
         //do whatever you want with it 
        } 
       } 
      } 
+0

Vous avez raison, il existe un moyen plus simple de convertir un 'XDocument' en chaîne. C'est la méthode 'ToString()'. Il y a une surcharge qui vous permet de spécifier si vous voulez que le XML soit indenté et formaté ou non (formatage par défaut). –

+0

Merci, changé à la fois mon code et l'exemple ci-dessus. –

+0

Qu'est ce que c'est "utiliser"? – baash05

0

votre code ci-dessus était manquant une parenthèse et avait une virgule supplémentaire, je l'ai fixé ici:

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/"; 
var document = new XDocument( 
    new XDeclaration("1.0", "utf-8", String.Empty), 
    new XElement(soapenv + "Envelope", 
     new XAttribute(XNamespace.Xmlns + "soapenv", soapenv), 
     new XElement(soapenv + "Header", 
      new XElement(soapenv + "AnyOptionalHeader", 
       new XAttribute("AnyOptionalAttribute", "false") 
      ) 
     ), 
     new XElement(soapenv + "Body", 
      new XElement(soapenv + "MyMethodName", 
       new XAttribute("AnyAttributeOrElement", "Whatever") 
      ) 
     ) 
    ) 
);