【问题标题】:How to dynamically invoke Web Services in .Net如何在 .Net 中动态调用 Web 服务
【发布时间】:2010-11-18 16:49:51
【问题描述】:

我正在用 C# 编写一个 Web 服务客户端,它接受 Web 服务的 URL 和一个 Web 方法名称。

我想检查这个 Web 方法是否真的接收到一个 int 并返回一个 DataTable,如果是这样,它应该调用它并返回 DataTable。

我发现了几篇文章,这些文章是通过动态编译 Proxy 类来完成的。

但对我而言,这太昂贵了,因为客户端实际上是一个 WSS WebPart,我不想每次呈现页面时都这样做;仅当属性发生变化时。

【问题讨论】:

    标签: asp.net web-services .net-3.5


    【解决方案1】:

    说到底,Web 服务描述只是一个 XML 文件。你可以通过请求 service.asmx?WSDL 来获取它:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?WSDL");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string xml = reader.ReadToEnd();
    

    一旦你有了服务描述,你就可以解析它并检查方法签名。然后,您可以使用 HTTP POST 调用该方法:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?HelloWorld");
    request.Method = "POST";
    request.ContentType = "application/soap+xml; charset=utf-8";
    
    byte[] data = Encoding.UTF8.GetBytes(
       @"<?xml version='1.0' encoding='utf-8'?>
       <soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'>
         <soap12:Body>
           <HelloWorld xmlns='http://tempuri.org/' />
         </soap12:Body>
       </soap12:Envelope>");
    
    request.ContentLength = data.Length;
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(data, 0, data.Length);
    requestStream.Close();
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string xml = reader.ReadToEnd();
    

    【讨论】:

    • 谢谢帕维尔!我会进入它并试一试......我还发现了一些关于 ServiceDescription 对象的信息,我认为这些信息可以帮助我验证 WSDL。
    【解决方案2】:

    如果 Web 服务始终相同(即方法和返回的内容相同)并且 uit 只是可能更改的 url,那么只需添加对项目的 web 引用,其中包含 webpart,像这样设置代理的 URL:

    using (var serviceProxy = new ServiceProxy())
    {
      serviceProxy.Url = somepropertysetbythewebpart;
      // make call to method here
    }
    

    【讨论】:

    【解决方案3】:

    经过大量研究,我发现了如何做到这一点。所选答案的代码几乎就在那里,但我必须在标题中添加SOAPAction,还要更改ContentType

    这是完整的代码:

    var strRequest = @"<soap12:Envelope> 
                        ... 
                        </soap12:Envelope>";
    
    string webServiceUrl = "http://localhost:8080/AccontService.svc";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl);
    
    request.Method = "POST";
    request.ContentType = "text/xml;charset=UTF-8";         
    request.Accept = "text/xml";
    request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount");
    
    byte[] data = Encoding.UTF8.GetBytes(strRequest);
    
    request.ContentLength = data.Length;
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(data, 0, data.Length);
    requestStream.Close();
    
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string responseXmlString = reader.ReadToEnd();
    
    return new HttpResponseMessage()
    {
        Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml")
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2011-11-05
      • 2011-01-30
      相关资源
      最近更新 更多