码迷,mamicode.com
首页 > Web开发 > 详细

.net中调用webservice,post、get方式实现调用

时间:2015-05-14 00:40:36      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

    1. 右键你的网站-〉添加服务引用-〉然后输入webservice的地址。

    2. 之后,你就可以用对象来操作你的webservice了

    3. 方法三:利用http 协议的get和post
      这是最为灵活的方法。


      View Code 
      using System;
      using System.Collections;
      using System.IO;
      using System.Net;
      using System.Text;
      using System.Xml;
      using System.Xml.Serialization;
      namespace Bingosoft.RIA.Common
      {
          /// <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
          }
      }

.net中调用webservice,post、get方式实现调用

标签:

原文地址:http://www.cnblogs.com/hui1107464497/p/4502098.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!