利用Web Services开发分布式应用
一、引言
在前面文章中分別介紹了MSMQ和.NET Remoting技術(shù),今天繼續(xù)分享.NET 平臺下另一種分布式技術(shù)——Web Services
二、Web Services 詳細介紹
2.1 Web Services 概述
? Web Services是支持客戶端與服務(wù)器通過網(wǎng)絡(luò)互操作的一種軟件系統(tǒng),是一組可以通過網(wǎng)絡(luò)調(diào)用的應(yīng)用程序API。在Web Services中主要到SOAP/UDDI/WSDL這三個核心概念,下面分別介紹下這三個概念的定義。
- SOAP:SOAP(Simple Object Access Protocol,簡單對象訪問協(xié)議)是在分散或分布式的環(huán)境中交換信息的簡單協(xié)議,是一種基于XML的協(xié)議,需要綁定一個網(wǎng)絡(luò)傳輸協(xié)議來完成信息的傳輸,這個協(xié)議通常是Http或Https,但也可以使其他協(xié)議。
它包括四個部分:
SOAP封裝:它定義了一個框架,描述消息中的內(nèi)容是描述,是誰發(fā)送的,誰又應(yīng)當(dāng)接收并處理;
SOAP編碼規(guī)則:定義了一種序列化的機制,用于表示應(yīng)用程序需要使用的數(shù)據(jù)類型的實例;
SOAP RPC:表示一種協(xié)定,用于表示遠程過程調(diào)用和應(yīng)答;
SOAP綁定:它定義了SOAP使用哪種協(xié)議來進行交換信息。使用Http/TCP/UDP都可以。與WCF中的綁定概念一致。
換句話說,SOAP協(xié)議只是用來封裝消息用的,封裝后的消息你可以通過各種已有的協(xié)議來傳輸,如Http、Https、Tcp、UDP、SMTP等,甚至你還可以自定義協(xié)議。然而Web Service是采用基于Http協(xié)議來傳輸數(shù)據(jù)的。關(guān)于使用Https協(xié)議來訪問Web Services的方法可以參考這個文章:如何利用 SSL 調(diào)用 Web 服務(wù)。
- UDDI:是統(tǒng)一描述、發(fā)現(xiàn)和集成(Universal Description, Discovery, and Integration)的縮寫,它是一個基于XML的跨平臺的描述規(guī)范,可以使世界范圍內(nèi)的企業(yè)在互聯(lián)網(wǎng)上發(fā)布自己所提供的服務(wù)供其他客戶查詢使用。
- WSDL:是Web服務(wù)描述語言(Web Services Description Language),是為描述Web服務(wù)發(fā)布的XML格式。用于描述服務(wù)器端口訪問方式和使用協(xié)議的細節(jié),通常用來輔助生產(chǎn)服務(wù)器和客戶端代碼及配置信息。
?
2.2 Web Services 實現(xiàn)過程
? 調(diào)用Web Services的實現(xiàn)過程與進行常規(guī)方法調(diào)用過程類似。不同的在于,前者方法并不位于客戶端應(yīng)用程序中,而是通過指定傳輸協(xié)議生成請求消息。因為Web Services可能位于不同的計算機上,因此必須將Web Services處理請求所需的信息通過網(wǎng)絡(luò)傳遞給含有Web Services的服務(wù)器,Web Services在處理信息后,會通過網(wǎng)絡(luò)將結(jié)果發(fā)送回客戶端應(yīng)用程序。下圖顯示了客戶端與Web Services之間的通信過程:
下面介紹下調(diào)用Web Services時事件發(fā)生順序:
2.3 Web Services 優(yōu)缺點
? 經(jīng)過上面詳細的介紹后,Web Services很明顯具有以下優(yōu)點:
- 跨平臺:Web Services完全基于XML(可擴展標(biāo)記語言)、XSD(XMLSchema)等與平臺無關(guān)的行業(yè)標(biāo)準(zhǔn)。
- 自描述:Web Service使用WSDL進行自我描述,包括服務(wù)的方法、參數(shù)、類型和返回值等相關(guān)信息。
- 跨防火墻:Web Service使用http協(xié)議進行通信,可以穿越防火墻。
Web Services也具有以下缺點:
- 效率低下,不適合做單應(yīng)用系統(tǒng)的開發(fā)。
- 安全問題:Web Services沒有自身的安全機制,必須借助Http協(xié)議或IIS等宿主程序?qū)崿F(xiàn)信息安全加密。
三、使用Web Services來開發(fā)分布式應(yīng)用程序
? 使用Web Services來開發(fā)分布式應(yīng)用較MSMQ和.NET Remoting來說相對簡單很多,今天的示例程序分三步走:
2. 創(chuàng)建Web Services服務(wù)類,需要創(chuàng)建一個繼承自SoapHeader,來接收SOAP 頭里的消息,并添加WebServiceUserValidation程序集。通過添加Asp.net 空Web應(yīng)用程序來創(chuàng)建Web Services服務(wù)工程,再右鍵創(chuàng)建的Web 應(yīng)用程序工程添加一個Web 服務(wù)文件來創(chuàng)建Web 服務(wù)。具體的實現(xiàn)代碼如下所示:
1 // 用戶自定義的SoapHeader類必須繼承于SoapHeader2 public class MySoapHeader : SoapHeader3 {4 // 存儲用戶憑證5 public string Token { get; set; }6 }7 /// <summary>8 /// LearningHardWebService 的摘要說明9 /// </summary> 10 [WebService(Namespace = "http://www.cnblogs.com/zhili/")] 11 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 12 [System.ComponentModel.ToolboxItem(false)] 13 // 若要允許使用 ASP.NET AJAX 從腳本中調(diào)用此 Web 服務(wù),請取消注釋以下行。 14 // [System.Web.Script.Services.ScriptService] 15 public class LearningHardWebService : System.Web.Services.WebService 16 { 17 // 存儲用戶憑證的Soap Header信息 18 // 必須保證是public和字段名必須與SoapHeader("memberName")中memberName一樣 19 // 否則會出現(xiàn)“頭屬性/字段 LearningHardWebService.authenticationToken 缺失或者不是公共的。”的異常 20 public MySoapHeader authenticationToken; 21 private const string TOKEN = "LearningHard"; // 存儲服務(wù)器端憑證 22 23 24 // 定義SoapHeader傳遞的方向 25 //SoapHeaderDirection.In;只發(fā)送SoapHeader到服務(wù)端,該值是默認值 26 //SoapHeaderDirection.Out;只發(fā)送SoapHeader到客戶端 27 //SoapHeaderDirection.InOut;發(fā)送SoapHeader到服務(wù)端和客戶端 28 //SoapHeaderDirection.Fault;服務(wù)端方法異常的話,會發(fā)送異常信息到客戶端 29 [SoapHeader("authenticationToken", Direction = SoapHeaderDirection.InOut)] 30 [WebMethod(EnableSession = false)] 31 public string HelloLearningHard() 32 { 33 if (authenticationToken != null && UserValidation.IsUserLegal(authenticationToken.Token)) 34 { 35 return "LearningHard 你好,調(diào)用服務(wù)方法成功!"; 36 } 37 else 38 { 39 throw new SoapException("身份驗證失敗", SoapException.ServerFaultCode); 40 } 41 } 42 }在上面代碼中需要注意的是,Web Servies中的Web方法需要拋出SoapExcetion異常才能被客戶端捕獲到,如果在Debug模式下調(diào)試運行的話,還需要在異常設(shè)置里把這個異常勾選掉,即編譯器不對該異常進行捕獲。
3. 創(chuàng)建控制臺客戶端,通過添加服務(wù)引用的方式來添加Web Services,添加成功后,會在客戶端程序中創(chuàng)建一個代理類,客戶端可以通過該代理類來調(diào)用Web Services的方法,具體的實現(xiàn)代碼如下所示:
1 namespace WebServiceClient2 {3 class Program4 {5 static void Main(string[] args)6 {7 // 實例化一個Soap協(xié)議的頭8 MySoapHeader mySoapHeader = new MySoapHeader() { Token = "LearningHard"};9 string sResult = string.Empty; 10 LearningHardWebServiceSoapClient learningHardWebSer = null; 11 try 12 { 13 // 實例化Web服務(wù)的客戶端代理類 14 learningHardWebSer = new LearningHardWebServiceSoapClient(); 15 // 調(diào)用Web服務(wù)上的方法 16 sResult= learningHardWebSer.HelloLearningHard(ref mySoapHeader); 17 // 輸出結(jié)果 18 Console.WriteLine(sResult); 19 } 20 catch 21 { 22 Console.WriteLine("調(diào)用Web服務(wù)失敗!"); 23 } 24 finally 25 { 26 // 釋放托管資源 27 if (learningHardWebSer != null) 28 { 29 learningHardWebSer.Close(); 30 } 31 } 32 33 Console.WriteLine("請按任意鍵結(jié)束..."); 34 Console.ReadLine(); 35 } 36 } 37 }關(guān)于Web Services異常捕獲的更多信息可以參考MSDN:在 XML Web services 中處理和引發(fā)異常。然而在這個MSDN上的示例代碼好像運行不成功,后面發(fā)現(xiàn),該文章中的客戶端對異常的處理只處理了SoapException 異常,而此時客戶端觸發(fā)的異常時FaultException異常,所以異常處理代碼應(yīng)像下面代碼一樣處理,當(dāng)然也可以直接只處理Exception異常,我上面代碼就只處理這個大范圍的異常。
catch (SoapException ex){// Do sth with SoapException }catch (Exception ex){// Do sth with Exception}經(jīng)過上面的步驟,我們就已經(jīng)完成了所有的開發(fā)工作,下面運行來測試下該程序的運行效果。把WebServiceClient作為啟動項目,直接按F5或Ctrl+F5來運行客戶端程序,你將看到如下所示的結(jié)果:
注:像一般分布式應(yīng)用程序,都應(yīng)用先運行服務(wù)器端,再運行客戶端來訪問服務(wù)方法。而這里我們運行卻直接運行客戶端就可以訪問Web Services中的Web方法了。這是因為在運行Web Services客戶端程序之前,會先把Web Services部署到IIS Express 中,你將會看到任務(wù)欄右下角有,右鍵該圖標(biāo)就可以看到運行的Web Services。
四、總結(jié)
? 到這里,Web Services技術(shù)的分享就結(jié)束,從下一篇文章開始,將正式進入WCF的世界。而Web Services的內(nèi)容和WCF內(nèi)容一樣也有很多,只是微軟官方推薦采用WCF來創(chuàng)建Web服務(wù)程序,如果你想更多地了解Web Services的內(nèi)容,可以參考MSDN:使用 ASP.NET 創(chuàng)建的 XML Web Services 以及 XML Web Services 客戶端
轉(zhuǎn)載于:https://www.cnblogs.com/yf2011/p/5460868.html
總結(jié)
以上是生活随笔為你收集整理的利用Web Services开发分布式应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio 压力测试注意
- 下一篇: 随机洗牌