hhhh2010

博客园 首页 新随笔 联系 订阅 管理

        原文地址:http://www.cnblogs.com/zouhao/p/6236785.html   ,此处仅测试了使用Http post请求调用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可以返回出结果集

   备注:方法类仅支持普通的值类型和string类型,如果参数包含复杂的引用类型,则需要调整xml构造部分

       

posted on 2017-10-30 13:14  hhhh2010  阅读(350)  评论(0编辑  收藏  举报