【问题标题】:Invoking an ASP.NET web service method via an http request通过 http 请求调用 ASP.NET Web 服务方法
【发布时间】:2009-10-22 18:58:13
【问题描述】:

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

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

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

  2. 创建 SOAP xml 信封;

  3. 使用 XmlSerializer 对我想传递给 Web 方法的任何参数进行序列化;

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

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

(1) 看起来很简单;

(2) 我不知道这里的信封是不是标准的,或者它应该如何改变取决于我调用的webservice方法。如果服务需要,我想我可能需要添加自定义肥皂标题?

(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.

【问题讨论】:

  • 只是好奇你为什么要这么辛苦?为什么不使用久经考验的工具?
  • 我在想,在 http 请求级别访问 Web 服务调用可以让我更好地控制诸如设置soap/http 标头之类的事情……此外,有时,要生成的 wsdl Web 服务客户端可能不可用(即使方法签名已知)...

标签: c# asp.net web-services soap


【解决方案1】:

我不知道我为什么要这样做,但这里有一个手动调用 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));
        }
    }
}

【讨论】:

  • 达林,谢谢。只是为了澄清一下,在 http 请求级别调用 web 服务方法是否存在固有的坏处?另外,给定 Web 方法签名和参数,是否有一种通用的方式来构建肥皂体?
  • 我想提名这个作为答案,因为它在一定程度上有所帮助,但是任何人都可以帮助澄清我上面提出的关于根据 webmethod 的论点创建肥皂体的问题吗?
  • @Shoko,SOAP 协议是一个相当复杂的协议,因此该框架为您提供了从 WSDL 生成客户端的工具:svcutil.exe (msdn.microsoft.com/en-us/library/aa347733.aspx) 和较旧的 wsdl.exe .它们生成强类型类,并允许您以简单的方式调用 Web 服务方法,而无需编写任何 XML 代码。
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
相关资源
最近更新 更多