跨域调用WebService
WebService使用還是比較廣泛的,這里我們來介紹兩種跨域請求調用WebService的方法。
首先我們來介紹下什么是WebService,Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。是通過SOAP在Web上提供的軟件服務,使用WSDL文件進行說明,并通過UDDI進行注冊。簡單的理解就是:webservice就是放在服務器上的函數,所有人都可以調用的一個公共接口。
Soap:(Simple Object Access Protocol)簡單對象存取協議。是XML Web Service 的通信協議。當用戶通過UDDI找到你的WSDL描述文檔后,他通過可以SOAP調用你建立的Web服務中的一個或多個操作。SOAP是XML文檔形式的調用方法的規范,它可以支持不同的底層接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一個 XML 文檔,用于說明一組 SOAP 消息以及如何交換這些消息。大多數情況下由軟件自動生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新項目。在用戶能夠調用Web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件,UDDI是一種根據描述文檔來引導系統查找相應服務的機制。UDDI利用SOAP消息機制(標準的XML/HTTP)來發布,編輯,瀏覽以及查找注冊信息。它采用XML格式來封裝各種不同類型的數據,并且發送到注冊中心或者由注冊中心來返回需要的數據。
我們來介紹第一種跨域調用WebService,使用服務器引用
右鍵點擊引用--服務器引用--高級--添加web引用
這里我們就可以看到一個Web References文件夾,這里就是放的我們調用的WebService,這個引用里面已經幫我們生成好了方法,我們只要實例化然后調用即可,然后我們調用它的方法,請求它里面的接口。
首先我們引用這個紅方框里面的,然后實例化這個橢圓框,接著調用里面的接口
using BLL.sfzxWebServerApi; namespace BLL {public class WX_IndexBLL{WebSiteServiceApi api = new WebSiteServiceApi();public void GetFriendshiplist(int language){var apistr = api.GetFriendshipLink(language, companyId);}} }對,這就是第一種方式,就這么簡單,接下來使用第二種方式,不使用服務引用
看代碼:
public class WebSvcCaller{//緩存xmlNamespace,避免重復調用GetNamespaceprivate static Hashtable _xmlNamespaces = new Hashtable();/// <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;}/// <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());}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("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");XmlElement soapMethod = doc.CreateElement(MethodName);soapMethod.SetAttribute("xmlns", XmlNs);foreach (string k in Pars.Keys){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();}}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("&");}}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,避免重復調用GetNamespaceprotected XmlDocument xx;protected void Page_Load(object sender, EventArgs e){Hashtable ht = new Hashtable();ht.Add("language", "1");ht.Add("companyId", "9006cc76-7ec7-4c79-9469-f8e4ef2af6b4");string URL = "http://www.xxxxxx.com/WebService/WebSiteServiceApi.asmx";xx = WebSvcCaller.QuerySoapWebService(URL, "GetFriendshipLink", ht);}總結
以上是生活随笔為你收集整理的跨域调用WebService的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于css和jQuery实现轮播图
- 下一篇: c语言数组与指针浅析