软件编程
位置:首页>> 软件编程>> C#编程>> 动态webservice调用接口并读取解析返回结果

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

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

标签: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可以返回出结果集

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com