簡體   English   中英

通過http請求調用ASP.NET Web服務方法

[英]Invoking an ASP.NET web service method via an http request

我想使用C#通過http POST請求調用ASP.NET Web服務(即我不想使用運行wsdl.exe生成的SoapHttpClientProtocol對象)。

據我所知,這個過程包括:

  1. 創建一個HttpWebRequest對象,該對象使用該方法指向Web服務的url /方法;

  2. 創建SOAP xml信封;

  3. 使用XmlSerializer序列化我想要傳遞給Web方法的任何參數;

  4. 發出請求,並解析響應。

我想這樣做而不必復制和使用生成的代碼。

(1)看起來很簡單;

(2)我不知道這里的信封是否標准,或者它應該如何改變,這取決於我呼叫的網絡服務方法。 我想如果服務需要,我可能需要添加自定義soap標頭?

(3)這樣做的過程是什么? 我認為我需要做這樣的事情:

MyClass myObj;
XmlSerializer ser = new XmlSerializer(myObj.GetType());
TextWriter writer = new StringWriter();
ser.Serialize(writer, myObj);
string soapXml = writer.ToString();
writer.Close();

另外,我想我應該將soapXml添加到soap:Body元素中

(4)我相信我應該提取和反序列化soap:Body元素的內容。 可以使用(3)中的過程的反向嗎?

謝謝,

K.

我不知道為什么我這樣做,但這是一個手動調用Web服務的示例。 請保證永遠不要在生產代碼中使用它。

假設您有以下SOAP服務:

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service1 : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld(Foo foo)
    {
        return "Hello World";
    }
}

您可以像這樣手動調用它:

class Program
{
    static void Main(string[] args)
    {
        using (WebClient client = new WebClient())
        {
            client.Headers.Add("SOAPAction", "\"http://tempuri.org/HelloWorld\"");
            client.Headers.Add("Content-Type", "text/xml; charset=utf-8");
            var payload = @"<?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><HelloWorld xmlns=""http://tempuri.org/""><foo><Id>1</Id><Name>Bar</Name></foo></HelloWorld></soap:Body></soap:Envelope>";
            var data = Encoding.UTF8.GetBytes(payload);
            var result = client.UploadData("http://localhost:1475/Service1.asmx", data);
            Console.WriteLine(Encoding.Default.GetString(result));
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM