【摘 要】REST是一種面向資源的架構(gòu),是一種面向服務(wù)開(kāi)發(fā)的解決方案,本文介紹怎么樣在 .NET 平臺(tái)下使用WCF和NHibernate技術(shù)構(gòu)建REST應(yīng)用。
【關(guān)鍵詞】wcf NHibernate REST應(yīng)用
一、REST簡(jiǎn)介
REST (REpresentation State Transfer,表述型狀態(tài)轉(zhuǎn)移)是2000年由Roy Fielding 首次提出,他是HTTP1.1協(xié)議的主要設(shè)計(jì)者。REST是一種風(fēng)格,而不是標(biāo)準(zhǔn),滿足這種設(shè)計(jì)風(fēng)格的應(yīng)用程序就是RESTFul。Roy Fielding在他的論文中描述了分布式信息系統(tǒng)是如何建造和運(yùn)作的。他描述了資源之間的相互影響,以及在此類(lèi)系統(tǒng)中唯一標(biāo)識(shí)符的角色,他也討論到了使用有限的一組操作和統(tǒng)一語(yǔ)義來(lái)建造一種到處存在的基礎(chǔ)架構(gòu),能夠支持任何類(lèi)型的應(yīng)用。
REST這種風(fēng)格是為面向互聯(lián)網(wǎng)的Web應(yīng)用而量身定做的。它是一種面向資源的架構(gòu)風(fēng)格,資源是REST中最關(guān)鍵的抽象概念,它們是能夠被遠(yuǎn)程訪問(wèn)的應(yīng)用程序?qū)ο?。一個(gè)資源就是一個(gè)標(biāo)識(shí)單位,任何可以被訪問(wèn)或被遠(yuǎn)程操縱的東西都可能是一個(gè)資源。資源可以是靜態(tài)的,也就是該資源的狀態(tài)永遠(yuǎn)不會(huì)改變。相反,某些資源的狀態(tài)可能隨著時(shí)間推移呈現(xiàn)很大的可變性。這兩種類(lèi)型的資源都是有效的。
資源必須有一個(gè)標(biāo)識(shí)符,以便在Web上尋址,每個(gè)標(biāo)識(shí)符與一個(gè)或多個(gè)表述相關(guān)聯(lián)。一個(gè)表述,指的是某個(gè)資源在某特定時(shí)刻的狀態(tài)的轉(zhuǎn)化形式或者視圖。這個(gè)視圖被編碼為一種或多種可轉(zhuǎn)移的格式,例如XHMTL、Atom、XML、JSON,甚至是存文本、MP3或者JPEG。
REST對(duì)資源的操作使用標(biāo)準(zhǔn)的HTTP接口,比如GET、PUT、POST、DELETE接口來(lái)實(shí)現(xiàn)查找、創(chuàng)建、修改和刪除的功能。接口中的每一個(gè)方法操作一個(gè)且僅有一個(gè)資源。每個(gè)方法的語(yǔ)義和含義不會(huì)因應(yīng)用程序或資源的不同而發(fā)生改變。
傳統(tǒng)上,分布式系統(tǒng)開(kāi)發(fā)將重點(diǎn)放在特定應(yīng)用的接口和交互式的形式來(lái)暴露定制的行為,與之相反,Web則將重點(diǎn)放在少量廣為人知的網(wǎng)絡(luò)動(dòng)作(GET、POST等)以及公共的表述格式,來(lái)為我們提供影響力——直接的連接性以及從移動(dòng)電話和嵌入設(shè)備到整個(gè)服務(wù)器集群普遍存在的支持,所有部分都共享一個(gè)公共的應(yīng)用基礎(chǔ)架構(gòu)。
二、REST的實(shí)現(xiàn)
在.NET平臺(tái)上實(shí)現(xiàn)REST服務(wù)首選WCF(Windows Communication Foundation)來(lái)進(jìn)行通信。WCF在.NET 3.0中首次出現(xiàn),是微軟將以前通信技術(shù)(ASMX,Remoting)的一個(gè)統(tǒng)一,并在.NET 4.0中進(jìn)行完善。它讓我們開(kāi)發(fā)人員在開(kāi)發(fā)分布式系統(tǒng)時(shí)有一個(gè)統(tǒng)一的接口,簡(jiǎn)化我們編寫(xiě)代碼的工作,以穩(wěn)固的方式支持HTTP、TCP/IP通信。
WCF服務(wù)可以在WinForm、控制臺(tái)、Windows服務(wù)、IIS中進(jìn)行承載,我們本文中選擇IIS中的ASP.NET進(jìn)行承載服務(wù)。
(一)類(lèi)必須使用[ServiceContract]和[AspNetCompatibilityRequirements]特性進(jìn)行標(biāo)注。
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
public class MailService
(二)方法還必須使用[OperationContract]特性,[WebGet]中的UrlTemplate即WCF的路由功能,使用它就可以創(chuàng)建REST風(fēng)格的服務(wù),ResponseFormat = WebMessageFormat.Json 表示返回的消息時(shí)候JSON進(jìn)行包裝。如下所示:
[OperationContract]
[WebGet(UriTemplate = \"/Mails/{id}\", ResponseFormat = WebMessageFormat.Json)]
public Mail GetById(string id)[OperationContract]
[WebGet(UriTemplate = \"/Mails/{id}\", ResponseFormat = WebMessageFormat.Json)]
public Mail GetById(string id)
(三)在.NET4.0中的Web.Config中只需要配置serviceHostingEnvironment節(jié)點(diǎn)和services節(jié)點(diǎn)就可以把一個(gè)類(lèi)庫(kù)中的方法暴露成服務(wù),無(wú)需創(chuàng)建真正的svc文件。若需要啟用服務(wù)的HTTP幫助,則需要把endpointBehaviors節(jié)點(diǎn)下的helpEnabled設(shè)置為true即可。
(四)IIS 7.x默認(rèn)不支持PUT和DELETE動(dòng)詞,若想啟用PUT和DELETE動(dòng)詞,則需要修改system.webServer節(jié)點(diǎn)。
參考文獻(xiàn):
[1][美]Roy Thomas Fielding, 《Architectural Styles and the Design of Network-based Software Architectures》,2000
[2][美]Roy Thomas Fielding,《REST APIs must be hypertext-driven》,2008.
[3][美]David Gourley Brian Totty 等著,《HTTP權(quán)威指南》,人民郵電出版社.
[4][美] Juval Lowy著,《WCF服務(wù)編程》,華中科技大學(xué)出版社.
[5][美] Jim Webber等著,《REST實(shí)戰(zhàn)》,東南大學(xué)出版社
[6][美] Dentler Jason著,《NHibernate 3.0 Cookbook》Packt Publishing.