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