30

我在 XML 文件中有 SOAP 请求。我想将请求发布到 .net 中的 Web 服务如何实现?

4

7 回答 7

20
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); 
于 2008-11-13T15:12:41.697 回答
5

I've done something like this, building an xml request manually and then using the webrequest object to submit the request:

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();

The string variables at the start of the code are what you set, then you get a string response (hopefully...) from the server.

于 2008-11-13T15:18:11.797 回答
3

This isn't the normal way. Usually you would use WCF or the older style web service reference to generate a proxy client for you.

However, what you need to do generally is use HttpWebRequest to connect to the URL and then send the XML in the body of the request.

于 2008-11-13T14:56:57.517 回答
2

I'm wondering how's the XML generated and is it a valid SOAP message? You can post it via HTTP as suggested by the folks above.

If you want to test if that's going to work, you can give SoapUI a try (for testing I mean).

于 2008-11-13T15:05:40.543 回答
2

这是另一个例子——这个在 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))
于 2009-01-14T04:32:08.443 回答
1

很抱歉碰到了一个旧线程,这是我的解决方案

''' <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
于 2011-02-25T09:44:23.600 回答
0

You need to post the data over HTTP. Use the WebRequest class to post the data. You will need to send other data with the post request to ensure you have a valid SOAP envelope. Read the SOAP spec for all of the details.

于 2008-11-13T14:53:50.910 回答