2008-11-13 7 views

Répondre

0

Vous devez publier les données sur HTTP. Utilisez le WebRequest class pour publier les données. Vous devrez envoyer d'autres données avec la demande de publication pour vous assurer d'avoir une enveloppe SOAP valide. Lisez le SOAP spec pour tous les détails.

+19

lol, "Lire la spécification de savon" ... années plus tard, il revient avec une barbe et se retrouve dans un asile psychiatrique. – duckworth

+0

La spécification SOAP est relativement simple, c'est le WS - quelles que soient les spécifications qui sucent le plus. –

3

Ce n'est pas la méthode normale. En général, vous utiliseriez WCF ou la référence de service Web de style ancien pour générer un client proxy pour vous. Cependant, ce que vous devez généralement faire est d'utiliser HttpWebRequest pour vous connecter à l'URL, puis envoyer le code XML dans le corps de la requête.

2

Je me demande comment le XML est généré et est-ce un message SOAP valide? Vous pouvez le poster via HTTP comme suggéré par les gens ci-dessus.

Si vous voulez tester si cela va fonctionner, vous pouvez essayer SoapUI (pour tester, je veux dire).

19
var uri = new Uri("http://localhost/SOAP/SOAPSMS.asmx/add"); 

var req = (HttpWebRequest) WebRequest.CreateDefault(uri); 
req.ContentType = "text/xml; charset=utf-8"; 
req.Method = "POST"; 
req.Accept = "text/xml"; 
req.Headers.Add("SOAPAction", "http://localhost/SOAP/SOAPSMS.asmx/add"); 

var strSoapMessage = @"<?xml version='1.0' encoding='utf-8'?> 
<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' 
       xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
       xmlns:xsd='http://www.w3.org/2001/XMLSchema'> 
    <soap:Body><add xmlns='http://tempuri.org/'><a>23</a><b>5</b></soap:Body> 
</soap:Envelope>"; 

using (var stream = new StreamWriter(req.GetRequestStream(), Encoding.UTF8)) 
    stream.Write(strSoapMessage); 
+1

Salut, si je n'ai pas de valeur SOAP ACTION dans mon xml –

6

Je l'ai fait quelque chose comme ça, la construction d'une requête XML manuellement, puis en utilisant l'objet WebRequest pour soumettre la demande:

string data = "the xml document to submit"; 
string url = "the webservice url"; 
string response = "the response from the server"; 

// build request objects to pass the data/xml to the server 
byte[] buffer = Encoding.ASCII.GetBytes(data); 
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = buffer.Length; 
Stream post = request.GetRequestStream(); 

// post data and close connection 
post.Write(buffer, 0, buffer.Length); 
post.Close(); 

// build response object 
HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
Stream responsedata = response.GetResponseStream(); 
StreamReader responsereader = new StreamReader(responsedata); 
response = responsereader.ReadToEnd(); 

Les variables de chaîne au début du code sont ce que vous ensemble, alors vous obtenez une réponse de chaîne (espérons ...) du serveur.

+0

Maintenant, j'essaie le même code que vous posté. Mais j'ai obtenu le type de support non pris en charge –

+0

Ce sera le request.ContentType, vous devriez essayer 'text/xml' (Je pense) pour un service web asp.net standard. –

+0

Son travail pour le service ASMX. Maintenant, je veux poster la demande SOAP pour le service WCF. Comment mettre en œuvre cela. –

3

Voici un autre exemple - celui-ci en VB:

Dim manualWebClient As New System.Net.WebClient() 

    manualWebClient.Headers.Add("Content-Type", "application/soap+xml; charset=utf-8") 

    ' Note: don't put the <?xml... tag in--otherwise it will blow up with a 500 internal error message! 
    Dim bytArguments As Byte() = System.Text.Encoding.ASCII.GetBytes(_ 
     "<soap12:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap12=""http://www.w3.org/2003/05/soap-envelope"">" & System.Environment.NewLine & _ 
     " <soap12:Body>" & System.Environment.NewLine & _ 
     " <Multiply xmlns=""http://cptr446.class/"">" & System.Environment.NewLine & _ 
     "  <x>5</x>" & System.Environment.NewLine & _ 
     "  <y>4</y>" & System.Environment.NewLine & _ 
     " </Multiply>" & System.Environment.NewLine & _ 
     " </soap12:Body>" & System.Environment.NewLine & _ 
     "</soap12:Envelope>") 
    Dim bytRetData As Byte() = manualWebClient.UploadData("http://localhost/CPTR446.asmx", "POST", bytArguments) 

    MessageBox.Show(System.Text.Encoding.ASCII.GetString(bytRetData)) 
1

Désolé pour cognant un vieux fil est ici ma solution à ce

''' <summary> 
''' Sends SOAP to a web service and sends back the XML it got back. 
''' </summary> 
Public Class SoapDispenser 
    Public Shared Function CallWebService(ByVal WebserviceURL As String, ByVal SOAP As String) As XmlDocument 
     Using wc As New WebClient() 
      Dim retXMLDoc As New XmlDocument() 

      wc.Headers.Add("Content-Type", "application/soap+xml; charset=utf-8") 
      retXMLDoc.LoadXml(wc.UploadString(WebserviceURL, SOAP)) 

      Return retXMLDoc 
     End Using 
    End Function 
End Class 
Questions connexes