通过http请求调用ASP.NET Web服务方法

Tol*_*ayi 2 c# asp.net soap web-services

我想使用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();
Run Code Online (Sandbox Code Playgroud)

另外,我想我应该将soapXml添加到soap:Body元素中

(4)我相信我应该提取和反序列化soap:Body元素的内容.可以使用(3)中的过程的反向吗?

谢谢,

K.

Dar*_*rov 8

我不知道为什么我这样做,但这是一个手动调用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";
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样手动调用它:

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)