閱讀目錄 開始 簡單使用 非同步調用WebServeices WebServices驗證 相關概念及資源 WebServices:簡單理解--解決了不同平臺之間應用程式間通信的問題,數據以XML格式在程式間傳輸 實際的應用場景:例如 比價網 為什麼比價網可以從眾多的電商站點獲得用戶搜索的產品數據?We ...
閱讀目錄
WebServices:簡單理解--解決了不同平臺之間應用程式間通信的問題,數據以XML格式在程式間傳輸 實際的應用場景:例如 比價網 為什麼比價網可以從眾多的電商站點獲得用戶搜索的產品數據?WebServices就可以實現(註意:是“可以實現”,我並沒有確切的說就是這麼實現,也許有其他的方法) 回到頂部簡單使用
1.在 "提供WebService服務" 站點中添加WebServices服務 2.再添加一個檢索數據的方法:SearchProduct(string searchKey){}using System.Collections.Generic; using System.Web.Services; namespace 提供WebService服務 { /// <summary> /// ComplexCalculate 的摘要說明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的註釋。 // [System.Web.Script.Services.ScriptService] public class ComplexCalculate : System.Web.Services.WebService { [WebMethod]//預設的WebServices服務 public string HelloWorld() { return "Hello World"; } //假設這是京東提供外部應用程式 訪問自己數據的服務 //根據用戶搜索關鍵字 返回檢索結果 private readonly Dictionary<string, string> dictionary = new Dictionary<string, string>(); [WebMethod]//特性表明該方法可供外部訪問 public string SearchProduct(string searchKey) { dictionary.Add("mx2", "聯通MX2 京東"); dictionary.Add("小米2", "小米四核 京東");//模擬數據 dictionary.Add("MeiZu", "MeiZu標準本 京東"); return dictionary[searchKey]; } } }
3.直接運行ComplexCalculate.asmx可以看到
Chrome瀏覽器返回如下 其實無論返回什麼樣的數據,都會以XML格式包裝輸出,也正是由於任何平臺都認識XML,解決了數據的跨平臺通信問題, 當然現在Json慢慢的變為行業標準,已成為XML的替代品
4.外部站點 "調用WebServices服務" 調用localhost:1088檢索服務時 首先添加服務引用 如圖:
像我這種 提供WebServices服務 與 調用WebServices服務 在同一解決方案下 直接點擊發現就可以了(如果是互聯網上的WebServices,那將提供的asmx地址複製到地址框中,點擊前往,就可以得到服務).確定後,會將該服務相關的配置信息寫入Web.Config中,如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="ComplexCalculateSoap" /> <binding name="NeedValidateWsSoap" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:1808/ComplexCalculate.asmx" binding="basicHttpBinding" bindingConfiguration="ComplexCalculateSoap" contract="SimpleUse.ComplexCalculateSoap" name="ComplexCalculateSoap" /> <endpoint address="http://localhost:1808/NeedValidateWS.asmx" binding="basicHttpBinding" bindingConfiguration="NeedValidateWsSoap" contract="AuthenticationPage.NeedValidateWsSoap" name="NeedValidateWsSoap" /> </client> </system.serviceModel> </configuration>關於,第2和3步做什麼,待續,圖先放這。 5.使用WebServices的SimpleUse.aspx.cs代碼如下:
using System; using 調用WebServices服務.SimpleUse; namespace 調用WebServices服務 { public partial class SimpleUsePage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //同步調用 using(SimpleUse.ComplexCalculateSoapClient client = new ComplexCalculateSoapClient()) { Response.Write(client.SearchProduct("mx2")); } } } }運行後顯示結果"聯通 MX2 京東",當然前提是提供WebServices服務必須開啟 是不是So easy!? 因為微軟讓它easy,如果是Java來做WebServices就沒這麼簡單了! 使用互聯網上免費的WebServices與上述大同小異,不啰嗦了. 回到頂部
非同步調用WebServeices
上述WebServices服務狠簡單,如果是一個狠複雜或者耗時的操作,那調用者豈不是要享受等待的煎熬?! 所以需要非同步調用WebServices 非同步調用有兩種方式: 1.上圖中添加索引服務時,有個"高級"選項,選擇之後,彈出"服務引用設置",我們選擇"生成非同步操作" 操作的背後,微軟幫我們針對SearchProduct方法生成了一個與之對應的非同步方法SearchProductAncys方法 UseAsync.aspx.cs後臺調用如下:using System; using 調用WebServices服務.SimpleUse; namespace 調用WebServices服務 { public partial class UseAsync : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { using(SimpleUse.ComplexCalculateSoapClient client = new ComplexCalculateSoapClient()) { client.SearchProductCompleted += client_SearchProductCompleted; //委托 接收非同步響應結果 } } void client_SearchProductCompleted(object sender, SearchProductCompletedEventArgs e) { Response.Write(e.Result);//輸出非同步返回結果 } } }
需要註意的是UseAsync.aspx頁面需要添加Async=true;允許接收非同步的配置
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UseAsync.aspx.cs" Async="true" Inherits="調用WebServices服務.UseAsync" %>2.第二種通過開啟一個後臺工作者,使用BackgroundWorker類,所屬命名空間:using System.ComponentModel;
using System; using System.ComponentModel; using 調用WebServices服務.SimpleUse; namespace 調用WebServices服務 { public partial class AsyncByWorker : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { BackgroundWorker background = new BackgroundWorker(); //設置需要非同步執行的操作 background.DoWork += background_DoWork; //接收非同步操作結果的"回調函數" background.RunWorkerCompleted += background_RunWorkerCompleted; //開始真正的執行非同步操作 不要遺漏 background.RunWorkerAsync(); } void background_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Response.Write(e.Result);//從Result中獲取結果 } void background_DoWork(object sender, DoWorkEventArgs e) { using(SimpleUse.ComplexCalculateSoapClient client = new ComplexCalculateSoapClient()) { e.Result = client.SearchProduct("mx2");//執行結果寫入Result中 } } } }前臺同上需要設置Async=true; 回到頂部
WebServices驗證
互聯網上提供的免費WebServices是任何人都可以使用的,而有些則需要用戶名、密碼才能使用,這些驗證是如何做到的呢? 方式有很多,這裡只說我知道也是最簡單的一種--通過Soap頭傳遞用戶名密碼進行身份校驗 步驟: 1.自定義MySelfSoapHeader繼承SoapHeader 並具有用戶名、密碼、身份校驗方法 2.在Services服務中添加SoapHeader特性及未初始化的MySelfSoapHeader實例 3.調用者對服務端MySelfSoapHeader實例化 同時為用戶名密碼賦值,提交至服務端 4.服務端返回驗證結果 MySelfSoapHeader.cs具有Name、Pwd欄位屬性 校驗方法如下using System.Web.Services.Protocols; namespace 提供WebService服務 { public class MySelfSoapHeader : SoapHeader { private string _name; private string _pwd; public string Name {get {return _name;}set {_name = value;}} public string Pwd {get {return _pwd;}set {_pwd = value;} } private bool ValidaResult(string name, string pwd) { if(name == "pizi" && pwd == "yimao") { return true; } return false; } public bool GetResult() { return ValidaResult(_name, _pwd); } } }
添加NeedValidateWS服務
using System.Web.Services; using System.Web.Services.Protocols; namespace 提供WebService服務 { /// <summary> /// NeedValidateWS 的摘要說明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class NeedValidateWs : System.Web.Services.WebService { public MySelfSoapHeader MySoapHeader = null;//這裡是通過客戶端實例化的 不要new [SoapHeader("MySoapHeader")] [WebMethod(Description = "需要驗證的方法")] public string IsValid() { if(MySoapHeader.GetResult()) { return "驗證通過"; } return "未通過驗證"; } } }調用頁面
using System; using 調用WebServices服務.AuthenticationPage; namespace 調用WebServices服務 { public partial class ValidPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { using(AuthenticationPage.NeedValidateWsSoapClient client = new NeedValidateWsSoapClient()) { MySelfSoapHeader header = new MySelfSoapHeader(); header.Name = "pizi"; header.Pwd = "yimao";//驗證通過 //header.Pwd = "sanmao";//未通過驗證 Response.Write(client.IsValid(header)); } } } }這種驗證方式存在數據的安全性問題,如果需要保證數據的安全性則使用加密演算法或者SSL等驗證方式,我瞭解的不多,所以不廢話了
回到頂部
相關概念及資源
SOAP:簡單對象訪問協議,在分散或分散式的環境中交換信息的簡單協議,基於XML協議解決了三個問題:1.介面的自我描述;2.採用Http協議等常規協議,不用寫原始的Socket;3.基於Web伺服器,不占用80埠之外的埠.
Web Services平臺元素 XML:可擴展標記語言,用來描述數據 WSDL:(WebService Defination Language)是對WebService上的方法名、參數進行描述的協議.對介面的自描述. SOAP:(Simple Object Access Protocol)對參數、返回值以什麼樣的格式進行傳遞進行描述的協議.對報文的格式規範. SOAP和HTTP的關係:SOAP基於Http協議的,和普通網頁不同的是網頁返回HTML,SOAP則是符合SOAP協議的XML數據. UDDI:用來自動發現WebService的協議 WebService優點: 跨平臺、跨語言調用,可以跨防火牆(基於Web伺服器,不占用80埠之外的埠); WebService缺點: 效率低.所以適用於兩個非內部系統的通訊(比如炒股軟體和證券交易所之間的通訊); 安全問題,Web Service的沒有自身的安全機制,必須藉助http協議或IIS等宿主程式實現信息安全加密WCF是對WebService、Socket、MQ等通訊方式的一個統一,底層還是採用這些通信協議,可以簡化這些程式的開發,不用再換不同通信協議的時候重寫代碼並且學一堆新的技術。所以WCF和WebService不是一個競爭取代關係。
WCF是對.Net Remoting、WebService、MQ等通訊方式的一個高級封裝,讓我們開發不同通訊協議的程式的時候很簡單,不用學更多的東西。並不是替代.Net Remoting、WebService、MQ這些東西。
Web Services平臺元素 XML:可擴展標記語言,用來描述數據 WSDL:(WebService Defination Language)是對WebService上的方法名、參數進行描述的協議.對介面的自描述. SOAP:(Simple Object Access Protocol)對參數、返回值以什麼樣的格式進行傳遞進行描述的協議.對報文的格式規範. SOAP和HTTP的關係:SOAP基於Http協議的,和普通網頁不同的是網頁返回HTML,SOAP則是符合SOAP協議的XML數據. UDDI:用來自動發現WebService的協議 WebService優點: 跨平臺、跨語言調用,可以跨防火牆(基於Web伺服器,不占用80埠之外的埠); WebService缺點: 效率低.所以適用於兩個非內部系統的通訊(比如炒股軟體和證券交易所之間的通訊); 安全問題,Web Service的沒有自身的安全機制,必須藉助http協議或IIS等宿主程式實現信息安全加密
http://blog.csdn.net/nealbzdn/article/details/204488 http://msdn.microsoft.com/zh-cn/library/vstudio/9z52by6a(v=vs.100).aspx http://msdn.microsoft.com/zh-cn/library/vstudio/w67h0dw7(v=vs.100).aspx http://dev.21tx.com/2009/02/28/11159.html http://dev.21tx.com/2009/02/24/14360_8.html http://blog.csdn.net/book_frank_xl http://www.shangxueba.com/jingyan/100145.html