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

标签 c# asp.net web-services soap

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

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

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

  2. 创建 SOAP xml 信封;

  3. 使用 XmlSerializer 序列化我想传递给网络方法的任何参数;

  4. 发出请求并解析响应。

我想这样做而不必复制和使用生成的代码。

(1) 看起来很简单;

(2) 不知道这里的信封是不是标准的,或者根据我调用的webservice方法应该如何变化。我想如果服务需要,我可能需要添加自定义 soap header ?

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

关于c# - 通过 http 请求调用 ASP.NET Web 服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1609294/

相关文章:

c# - 我可以以编程方式启动 "services.msc"并将用户集中在确切的服务上吗?

asp.net - Request.ServerVariables ["HTTP_X_FORWARDED_FOR"] 和 Request.Headers ["X-Forwarded-For"] 之间有区别吗?

asp.net - 向导控件中的 Gridview 自定义分页在 asp.net 中无法正常工作

linux - 如何设置虚拟主机以使用 nginx 自动索引文件

c# - WCF错误: Soap Headers are not supported by the None Message Version

c# - 在线程中调用互操作 Excel 函数时出现 CastError?

c# - WPF 数据绑定(bind) : Nullable Int still gets a validation error?

c# - 单击下拉列表的箭头/延迟加载下拉列表加载下拉列表

jquery - 使用 JQuery 通过 sharepoint Web 服务删除文档

c# - Prism.Unity.Wpf问题: UnityServiceLocatorAdapter is missing after update