动态webservice调用接口并读取解析返回结果

 更新时间:2015年06月04日 08:54:09   投稿:hebedich  
webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口。今天我们来详细讨论下如何动态调用以及读取解析返回结果

这里给大家带来的是动态webservice调用接口并读取解析返回结果的具体示例,非常的简单,注释也很详细,小伙伴们可以参考下。

using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Hishop.Plugins
{
  /// <summary>
  /// 利用WebRequest/WebResponse进行WebService调用的类
  /// </summary>
  public class WebServiceCaller
  {
    #region Tip:使用说明
    //webServices 应该支持Get和Post调用,在web.config应该增加以下代码
    //<webServices>
    // <protocols>
    //  <add name="HttpGet"/>
    //  <add name="HttpPost"/>
    // </protocols>
    //</webServices>
 
    //调用示例:
    //Hashtable ht = new Hashtable(); //Hashtable 为webservice所需要的参数集
    //ht.Add("str", "test");
    //ht.Add("b", "true");
    //XmlDocument xx = WebSvcCaller.QuerySoapWebService("http://localhost:81/service.asmx", "HelloWorld", ht);
    //MessageBox.Show(xx.OuterXml);
    #endregion
 
    /// <summary>
    /// 需要WebService支持Post调用
    /// </summary>
    public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      SetWebRequest(request);
      byte[] data = EncodePars(Pars);
      WriteRequestData(request, data);
      return ReadXmlResponse(request.GetResponse());
    }
 
    /// <summary>
    /// 需要WebService支持Get调用
    /// </summary>
    public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
      request.Method = "GET";
      request.ContentType = "application/x-www-form-urlencoded";
      SetWebRequest(request);
      return ReadXmlResponse(request.GetResponse());
    }
 
    /// <summary>
    /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
    /// </summary>
    public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
    {
      if (_xmlNamespaces.ContainsKey(URL))
      {
        return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
      }
      else
      {
        return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
      }
    }
 
    private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
    {
      _xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
      request.Method = "POST";
      request.ContentType = "text/xml; charset=utf-8";
      request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");
      SetWebRequest(request);
      byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
      WriteRequestData(request, data);
      XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
      doc = ReadXmlResponse(request.GetResponse());
 
      XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
      mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
      String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
      doc2.LoadXml("<root>" + RetXml + "</root>");
      AddDelaration(doc2);
      return doc2;
    }
    private static string GetNamespace(String URL)
    {
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
      SetWebRequest(request);
      WebResponse response = request.GetResponse();
      StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(sr.ReadToEnd());
      sr.Close();
      return doc.SelectSingleNode("//@targetNamespace").Value;
    }
 
    private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
    {
      XmlDocument doc = new XmlDocument();
      doc.LoadXml("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>");
      AddDelaration(doc);
      //XmlElement soapBody = doc.createElement_x_x("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
      XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
      //XmlElement soapMethod = doc.createElement_x_x(MethodName);
      XmlElement soapMethod = doc.CreateElement(MethodName);
      soapMethod.SetAttribute("xmlns", XmlNs);
      foreach (string k in Pars.Keys)
      {
        //XmlElement soapPar = doc.createElement_x_x(k);
        XmlElement soapPar = doc.CreateElement(k);
        soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
        soapMethod.AppendChild(soapPar);
      }
      soapBody.AppendChild(soapMethod);
      doc.DocumentElement.AppendChild(soapBody);
      return Encoding.UTF8.GetBytes(doc.OuterXml);
    }
    private static string ObjectToSoapXml(object o)
    {
      XmlSerializer mySerializer = new XmlSerializer(o.GetType());
      MemoryStream ms = new MemoryStream();
      mySerializer.Serialize(ms, o);
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
      if (doc.DocumentElement != null)
      {
        return doc.DocumentElement.InnerXml;
      }
      else
      {
        return o.ToString();
      }
    }
 
    /// <summary>
    /// 设置凭证与超时时间
    /// </summary>
    /// <param name="request"></param>
    private static void SetWebRequest(HttpWebRequest request)
    {
      request.Credentials = CredentialCache.DefaultCredentials;
      request.Timeout = 10000;
    }
 
    private static void WriteRequestData(HttpWebRequest request, byte[] data)
    {
      request.ContentLength = data.Length;
      Stream writer = request.GetRequestStream();
      writer.Write(data, 0, data.Length);
      writer.Close();
    }
 
    private static byte[] EncodePars(Hashtable Pars)
    {
      return Encoding.UTF8.GetBytes(ParsToString(Pars));
    }
 
    private static String ParsToString(Hashtable Pars)
    {
      StringBuilder sb = new StringBuilder();
      foreach (string k in Pars.Keys)
      {
        if (sb.Length > 0)
        {
          sb.Append("&");
        }
        //sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
      }
      return sb.ToString();
    }
 
    private static XmlDocument ReadXmlResponse(WebResponse response)
    {
      StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
      String retXml = sr.ReadToEnd();
      sr.Close();
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(retXml);
      return doc;
    }
 
    private static void AddDelaration(XmlDocument doc)
    {
      XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
      doc.InsertBefore(decl, doc.DocumentElement);
    }
 
    private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
  }
}

//调用并读取解析返回结果
 
 DataSet ds = new DataSet(); 
    XmlNode xmlNode1;
    XmlDataDocument xd = new XmlDataDocument();
    StringBuilder sb; 
    Hashtable ht = new Hashtable();
    ht.Add("xmlIn", "<Request><MemCode>001</MemCode></Request>");
    xmlNode1 = Hishop.Plugins.WebServiceCaller.QuerySoapWebService("http://xxx.xxxx.com/Service.asmx", "SinPointQuery", ht);
    if (xmlNode1 == null)
    {
      return;
    }
    string xmlstr= HttpUtility.HtmlDecode(xmlNode1.OuterXml);
    sb = new StringBuilder(xmlstr);
    if (sb.ToString().Equals(""))
    {
      return;
    }
    xd.LoadXml(sb.ToString());
    ds.ReadXml(new XmlNodeReader(xd)); 
    //ds可以返回出结果集

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • C#开发Windows UWP系列之对话框MessageDialog和ContentDialog

    C#开发Windows UWP系列之对话框MessageDialog和ContentDialog

    这篇文章介绍了C#开发Windows UWP系列之对话框MessageDialog和ContentDialog,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#使用WebClient登录网站并抓取登录后的网页信息实现方法

    C#使用WebClient登录网站并抓取登录后的网页信息实现方法

    这篇文章主要介绍了C#使用WebClient登录网站并抓取登录后的网页信息实现方法,涉及C#基于会话操作登陆网页及页面读取相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法

    C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法

    这篇文章主要介绍了C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法,涉及WinForm改变窗口大小时动态判断当前窗口尺寸的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-11-11
  • C#中的协变与逆变深入讲解

    C#中的协变与逆变深入讲解

    这篇文章主要给大家介绍了关于C#中协变与逆变的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • c#使用FreeSql生产环境时自动升级备份数据库

    c#使用FreeSql生产环境时自动升级备份数据库

    使用FreeSql,包含所有的ORM数据库,都会存在这样的问题。在codefirst模式下,根据代码自动更新数据库,都建议不要在生产环境使用。因为容易丢失数据,本文提供一种自动更新数据库的解决的思路:在判断需要升级时,才自动升级,同时升级前先备份数据库
    2021-06-06
  • C#调用HTTP POST请求上传图片的示例代码

    C#调用HTTP POST请求上传图片的示例代码

    现在很多B/S系统的开发都是通过API方式来进行的,一般服务端会开放一个API接口,客户端调用API接口来实现图片或文件上传的功能,感兴趣的可以了解一下
    2021-05-05
  • 基于WPF实现简单的文件夹比较工具

    基于WPF实现简单的文件夹比较工具

    文件比较平常都是用Beyond Compare,可以说离不开的神器,不过Beyond Compare平常拿它主要是用来做代码比较,用来做一些大批量的二进制文件比较,其实有点不是很方便,所以本文来用WPF做一个简单的文件夹比较的小工具
    2023-05-05
  • 如何利用C#打印九九乘法表

    如何利用C#打印九九乘法表

    这篇文章主要给大家介绍了关于如何利用C#打印九九乘法表的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C#通过流写入数据到文件的方法

    C#通过流写入数据到文件的方法

    这篇文章主要介绍了C#通过流写入数据到文件的方法,涉及C#通过字节流读写文件的相关技巧,需要的朋友可以参考下
    2015-07-07
  • C#实现图片分割方法与代码

    C#实现图片分割方法与代码

    C#实现图片分割方法与代码...
    2007-03-03

最新评论