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

我想使用C#通过http POST请求调用ASP.NET Web服务(即我不想使用运行wsdl.exe生成的SoapHttpClientProtocol对象)。

据我所知,这个过程包括:

  1. 使用该方法创建指向Web服务的url /方法的HttpWebRequest对象;

  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 = @"1Bar"; var data = Encoding.UTF8.GetBytes(payload); var result = client.UploadData("http://localhost:1475/Service1.asmx", data); Console.WriteLine(Encoding.Default.GetString(result)); } } }