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

作者:hebedich 时间:2021-10-19 07:05:45 

这里给大家带来的是动态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可以返回出结果集

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

标签:webservice,调用,解析
0
投稿

猜你喜欢

  • SpringBoot实现埋点监控

    2022-11-27 06:32:07
  • C# Socket网络编程实例

    2023-03-18 05:09:28
  • ThreadLocal使用案例_动力节点Java学院整理

    2021-06-08 09:57:15
  • spring框架集成flyway项目的详细过程

    2023-09-14 11:47:14
  • Android自定义带圆点的半圆形进度条

    2023-08-05 07:47:15
  • C# readnodefile()不能读取带有文件名为汉字的osg文件解决方法

    2021-11-08 07:41:00
  • Android使用Intent传递组件大数据

    2023-09-30 12:21:46
  • Java中自动装箱、拆箱引起的耗时详解

    2023-01-11 11:42:42
  • Android存储字符串数据到txt文件

    2021-11-05 21:55:16
  • 在Android Studio中Parcelable插件的简单使用教程

    2022-05-08 17:12:26
  • 非常实用的小功能 Android应用版本的更新实例

    2023-10-28 03:41:51
  • 详谈Java中Object类中的方法以及finalize函数作用

    2021-05-29 07:59:25
  • C#泛型的逆变协变之个人理解

    2021-05-28 16:33:03
  • 深入分析Android ViewStub的应用详解

    2022-09-14 16:50:19
  • android Retrofit2网络请求封装介绍

    2022-02-09 18:46:49
  • SpringMVC 参数绑定相关知识总结

    2022-06-05 12:50:54
  • Java中EasyPoi多sheet导出功能实现

    2023-01-15 08:10:39
  • Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    2023-03-21 21:22:27
  • Android微信右滑退出功能的实现代码

    2021-12-26 07:15:48
  • 解决Android软键盘弹出覆盖h5页面输入框问题

    2023-06-19 11:33:24
  • asp之家 软件编程 m.aspxhome.com