韓豐羽
【摘 要】為實現(xiàn)Android和.NET平臺的跨平臺的數(shù)據(jù)傳輸方式,本文運用了REST風格的WCF服務框架,并將WCF托管在IIS上,同時在Android客戶端上使用HttpClient,通過唯一標識符調用相對應的服務方法。經(jīng)過多次實驗表明,運用這種方式進行數(shù)據(jù)通信,可以減輕服務器的負擔,降低與服務端通信的難度,且使程序更加可維護。
【關鍵詞】WCF RESTful Android 數(shù)據(jù)交互
1 WCF平臺概述
Windows Communication Foundation(WCF)是使用托管代碼建立和運行面向服務的應用程序框架,主要是用來做松耦合的分布式通訊,它提供的包括托管、安全、異步等豐富功能使得開發(fā)者能夠建立一個跨平臺、可信賴、服務實例實力管理、事務管理的解決方案,且融合了.Net 平臺下多種和分布式系統(tǒng)有關的技術:
(1)WSE(2)Net Remoting(3)ASMX(4)MSMQ。
1.1 WCF要素
地址:服務托管地址,每個服務都具有唯一地址,用來指定服務所在位置和傳輸協(xié)議,以供其它服務和客戶端通過地址來對服務進行訪問。每一個服務的地址由一個統(tǒng)一資源標示符(URI)來表示。
契約:用來描述服務功能,屬于服務公開接口的一部分。契約分為:
(1)服務契約:定義了客戶端調用時所執(zhí)行的服務執(zhí)操作;
(2)數(shù)據(jù)契約:定義了數(shù)據(jù)類型;
(3)消息契約:直接對soap頭和soap體進行交互和控制。
綁定:它封裝了傳輸協(xié)議、消息編碼、安全傳遞、通信模式等一組綁定元素組成的通信基礎結構。綁定可以加速開發(fā)過程,且充分利用內置的各種特性。
宿主:WCF服務需要承載在一個宿主上。WCF提供了多種宿主形式,包括自寄宿、IIS寄宿、Windows服務、Com+組件等。本文采用的是IIS寄宿。
1.2 REST風格
REST(Representational State Transfer)是一種輕量級的Web Service架構風格,對比SOAP和WSDL等復雜接口,其實現(xiàn)和操作明顯更為簡潔,且降低了開發(fā)的復雜性。
REST架構風格遵循了CRUD原則,即只需要四種行為:Create(創(chuàng)建)、Read(讀?。pdate(更新)和Delete(刪除)就可以完成對資源的操作和處理,它并不關心消息的定義與方法的設計。本文中選定HTTP/HTTPS協(xié)議作為REST這種框架風格的統(tǒng)一的網(wǎng)絡通信協(xié)議,REST充分的利用了HTTP協(xié)議提供的四中方法,其中:
(1)創(chuàng)建資源在服務器上,使用POST方法;
(2)查找某個資源,使用GET方法;
(3)更改資源狀態(tài)或對其更新,使用PUT方法;
(4)刪除某個資源,使用DELETE方法。
REST支持HTML、XML、JSON等多種格式,本文采取的是JSON格式。
2 WCF服務端開發(fā)
服務端通過提供服務的訪問點,使客戶端可以調用其服務。本文中REST風格的WCF服務端與客戶端之間的耦合度更低,服務端僅在收到客戶端請求使才有響應,平時完全不關心客戶端狀態(tài),減輕了服務端的負擔,使其只保留資源狀態(tài)信息和提供給客戶端的接口功能。
2.1 創(chuàng)建WCF服務應用程序
在新建了一個WCF服務應用程序后,添加自定義的WCF服務文件WcfTest.svc,此時vs2012會自動生成接口文件IWcfTest.cs。接口文件如下:
要在WCF中創(chuàng)建REST風格的應用程序就必須用到System.ServiceModel.Web.dll組件。服務方法中[WebInvoke]特性是REST的重要元素,其屬性用于修改或刪除數(shù)據(jù)的操作,例如上述程序中UriTemplate屬性使URI定義了一個自定義資源,客戶端通過UriTemplate定義的資源名來訪問該服務;對于ResponseFormat,RequestFormat屬性是用于定義對服務操作發(fā)出的請求和響應格式,本文采用的是JSON格式。服務文件中就定義著接口的具體實現(xiàn),再次不在累述。
需注意的一點是,本文是搭建一個REST風格的WCF服務應用程序,所以需要設置綁定為webHttpBinding,它是REST風格綁定,具體設置步驟:
(1)在解決方案框內找到Web.config;
(2)右擊后找到WCF配置選項,選擇新建服務;
(3)在bin文件夾里找到對應的動態(tài)鏈接庫,選擇并找到對應服務類型;
(4)設置服務終結點,找到Binding項,改為webHttpBinding。
2.2 IIS宿主
僅開發(fā)了自己的服務并不可以讓外部客戶端調用,還需要一個宿主進程來承載這些服務,WCF的托管服務包括:自托管和IIS托管。本文使用IIS托管,其優(yōu)點是可實現(xiàn)程序隔離,管理程序的生命周期。雖限制只能使用HTTP/HTTPS協(xié)議,但本文采取webHttpBinding綁定,限制協(xié)議類型也就不是缺點了。
首先在服務器上添加一個網(wǎng)站。由于.NET framework4.0才支持REST風格,所以要將新添加網(wǎng)站的.NET framework版本改為v4.0。
接下來再次“重新生成解決方案”,右擊工程選擇“發(fā)布”選項,彈出web發(fā)布對話框。填寫信息后點擊“驗證連接”,當出現(xiàn)綠色對號時說明連接成功。這時點擊發(fā)布,整個WCF就發(fā)布到服務器的IIS上了。具體內容如下圖2-1。
由于IIS服務器默認是不支持PUT和DELETE操作,返回“403-Forbidden”錯誤,因此需要修改IIS新建網(wǎng)站的屬性設置為全部動作。最后檢驗是否發(fā)布成功,在IIS管理器中找到新建好的網(wǎng)站,點擊瀏覽網(wǎng)站,當出現(xiàn)下圖2-2時,證明發(fā)布成功了。
3 Android客戶端開發(fā)
在REST風格下,Android客戶端只要通過資源的URI就可以輕松的訪問服務,實現(xiàn)與服務的交互。相比于傳統(tǒng)JDK自帶的HttpURLConnection,本文運用的HttpClient更簡單易用,靈活方便。
3.1 HttpClient介紹
HttpClient封裝了訪問http的請求頭,參數(shù),內容體,響應等等。具體步驟:
(1)首先創(chuàng)建HttpClient對象。本文采用創(chuàng)建POST請求方法HttpPost實例,并指定請求URL;
(2)接下來對HttpPost對象調用setHeader()方法設置HTTP協(xié)議的消息頭和交互信息的類型,同時規(guī)定setEntity()方法來設置請求參數(shù);
(3)調用HttpClient對象的execute()發(fā)送請求,該方法返回一個HttpResponse;
(4)調用返回的HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。
3.2創(chuàng)建Android應用程序
在了解HttpClient的操作方法后,我們知道它是和HTTP/HTTPS協(xié)議進行交互,那么一定要設定Android的網(wǎng)絡訪問權限:
其次由于客戶端與服務端的數(shù)據(jù)交互是一個很費時的過程,為避免出現(xiàn)界面卡頓導致降低用戶體驗的問題,Android2.3開始要求網(wǎng)絡通信操作時要放在一個單獨的線程中,因此我們要把調用服務的過程放在子線程里面,具體過程如下:
4結語
本文詳述了REST風格的WCF與Android客戶端進行信息交互的方式,通過以上方法可以實現(xiàn)跨平臺通信。REST風格使客戶端在訪問服務方法時不用關心服務端業(yè)務方法的復雜性。并且因為WCF的成熟性,使實現(xiàn)跨平臺通信的方法跟簡單易用,安全性高,健壯性強。
參考文獻:
[1]袁贊.Java與RESTful Web Service[J].電腦知識與技術 學術交流,2007.
[2]趙海寧,李洋.基于WCF框架的應用與研究[J].電腦知識與技術,2010 .
[3]朱夏,王茜.異構系統(tǒng)間數(shù)據(jù)交互模型的設計與實現(xiàn)[J].東南大學學報 自然科學版,2006 36(2):226-227.
[4]Pablo Cibraro,Kurt Claeys,F(xiàn)abio Cozzolino,Johann Grabner Professional WCF 4[M] Wiley 2010.05.28.