WCF如何實現對於Rest支持的呢?弄清這一點是學習Rest WCF的關鍵。 為了實現於對Rest的支持,在 .NET Framework 中,WCF 在 System.ServiceModel.Web 組件中新增了編程模型和一些基礎架構部件。WCF Web編程模型幾個重要類型就是: ...
一、什麼是REST
表述性狀態轉移(Representational State Transfer,REST),不是一種標準,而是一種軟體架構風格。
基於REST的服務與基於SOAP的服務相比,性能、效率和易用性上都更高,而SOAP協議非常的複雜和不透明。REST受到越來越多的Web服務供應商歡迎。目前大部分供應商,如淘寶、騰訊、google、Amazon等都提供REST風格的服務。
REST的主要原則是:
1.網路上的所有事物都可被抽象為資源;
2.每個資源都有一個唯一的資源標識符URI;
3.使用標準方法操作資源;
4.所有的操作都是無狀態的;
5.通過緩存來提高性能。
REST (Representation State Transfer) 描 述了一個架構樣式的網路系統,比如Web應用程式。它首次出現在2000年 Roy Fielding 的博士論文中,他是HTTP規範的主 要編寫者之一。REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是 RESTful。
使用REST做為業務邏輯介面是因為,從客戶端到伺服器的每個請求都必須包含理解請求所必需的信息。如果伺服器在請求之間的任何時間點重啟,客戶端不會得 到通知。此外,無狀態請求可以由任何可用伺服器回答,這十分適合雲計算之類的環境。客戶端可以緩存數據以改進性能。
在伺服器端,應用程式狀態和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程式對象、資料庫記錄、演算法等等。每個 資源都使用 URI (Universal Resource Identifier) 得到一個惟一的地址。客戶端使用的是標準的 HTTP協議進行資 源訪問,同時還可以使用標準的HTTP方法,比如 GET、PUT、POST 和 DELETE。
REST的一個重要原則是系統分層,這表示組件無法瞭解它與之交互的中間層以外的組件。通過將系統的某些功能限制在某一層,由此可以限制整個系統的複雜性,促進了底層的獨立性。
當 REST 架構的約束條件作為一個整體應用時,將生成一個可以擴展到大量客戶端的應用程式。它還降低了客戶端和伺服器之間的交互延遲。統一界面簡化了整個系統架構,改進了子系統之間交互的可見性。REST 簡化了客戶端和伺服器的實現。
REST的資源表述形式可以是XML、HTML、JSON,或者其他任意的形式,這取決於服務提供商和消費服務的用戶。
但是REST不是萬能的。操作無狀態也會帶來巨大的安全問題,如何授權和驗證用戶?如果要求每次請求都包含完整的身份和驗證信息,又如何避免信息泄漏?複雜的功能挑戰架構的易用性,這就需要在性能與功能間權衡,究竟該用REST還是SOAP。
二、Rest的優點
1)緩存,使用 HTTP 向 RESTful 端點申請數據時,用到的 HTTP 動詞是 GET。對於 GET 請求響應中返回的資源,可以用多種不同的方式進行緩存。Conditional GET 就是可供選擇的一種實現細節,客戶端可以向服務驗證他的數據是否為最新版本;RESTful 端點可以通過它進一步提高速度和可伸縮性。
2)擴展,REST 鼓勵每項資源包含處理特殊請求所需的所有必要狀態。滿足這一約束時,RESTful 服務更易於擴展且可以沒有狀態。
3)副作用,使用 GET 請求資源,RESTful 服務應該沒有副作用(遺憾的是,與其他一些 REST 約束相比,這一約束更容易被打破)。
4)冪等,統一介面另外兩個常用到的主要 HTTP 動詞是 PUT 和 DELETE。用戶代理想要修改資源時最常使用 PUT,DELETE 可以自我描述。要點(也就是“冪等”一詞所強調的)是您可以對特殊資源多次使用這兩個動詞,效果與首次使用一樣——至少不會有任何其他影響。構建可靠的分 布式系統時(即錯誤、網路故障或延遲可能導致多次執行代碼),這一優點可提供保障。
5)互操作性許,多人將 SOAP 捧為建立客戶端-伺服器程式最具互操作性的方法。但一些語言和環境至今仍沒有 SOAP 工具包。有一些雖然有工具包,但採用的是舊標準,不能保證與使用更新標準的工具包可靠溝通。對於大多數操作,REST 僅要求有 HTTP 庫(當然,XML 庫通常也很有幫助),它的互操作性肯定強過任何 RCP 技術(包括 SOAP)。
6)簡易性與其他優點相比,這一優點更主觀一些,不同的人可能有不同的感受。對我而言,使用 REST 的簡易性涉及到代表資源的 URI 和統一介面。作為一名 Web 衝浪高手,我理解在瀏覽器中輸入不同的 URI 可以得到不同的資源(有時也被稱為 URI 或 URL 黑客,但絕無惡意)。由於有多年使用 URI 的經驗,所以為資源設計 URI 對我來說得心應手。使用統一介面簡化了開發過程,因為我不必為每個需要建立的服務構建介面、約定或 API。介面(客戶端與我的服務交互的方式)由體繫結構約束設置。
三、WCF如何支持Rest
WCF如何實現對於Rest支持的呢?弄清這一點是學習Rest WCF的關鍵。
為了實現於對Rest的支持,在 .NET Framework 中,WCF 在 System.ServiceModel.Web 組件中新增了編程模型和一些基礎架構部件。WCF Web編程模型幾個重要類型就是:
1) WebGetAttribute 和 WebInvokeAttribute:
我們知道,在WCF中,對於方法的調用是基於SOAP的Action的,每個客戶端發送的SOAP消息都需要指定一個Action 的值。這個Action的值和WCF服務的方法對應。每個WCF服務端的操作都有一個特定的Action。通過 OperationContractAttribute.Action 屬性設置。
在Rest WCF中,基於Action的方法調用轉變為了基於URI+Http動詞的調用。也就是SOAP Action=URI+Http動詞。
這種映射會由WebHttpDispatchOperationSelector 類型來完成,它會把客戶端請求的URI+Http動詞,映射到特定的服務方法上。
WebGetAttribute 告訴服務方法應該響應 HTTP GET 請求。
WebInvokeAttribute 預設映射為 HTTP POST,但可將WebInvokeAttribute.Method 屬性設置為支持所有其他 HTTP 動詞(PUT 和 DELETE 等)。例如:
[WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)] [OperationContract] List<Books> GetBook(string BookId); [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)] [OperationContract] Result AddBook(Books book);
2) UriTemplate 和 UriTemplateTable:
UriTemplate 一個表示統一資源標識符 (URI) 模板的類。可以定義服務操作的路徑和HTTP動詞。
UriTemplateTable一個表示一組關聯 UriTemplate 對象的類。也就是UriTemplate表。
從上面的例子代碼,我們也能看出如何使用UriTemplate 定義服務操作的URI和HTTP動詞。
3) WebHttpBinding 和 WebHttpBehavior:
WebHttpBinding允許開發人員通過 HTTP 請求(這些請求使用“Plain old XML”(POX) 樣式消息,而不是使用基於 SOAP 的消息)來公開 WCF Web 服務,可以很便利的實現REST。
與其他綁定不同的是:必須使用WebHttpBehavior對服務的終結點進行配置。還要求使用WebGetAttribute或WebInvokeAttribute屬性將各個服務操作映射到 URI,同時定義調用和返回結果的消息格式。
WCF Web 編程模型允許開發人員通過 HTTP 請求(這些請求使用朴素的舊的“Plain old XML”(POX) 樣式消息,而不是SOAP 的消息)來公開 WCF服務。為了讓客戶端使用 HTTP 請求與服務進行通信,必須使用附加了 WebHttpBehavior 的 WebHttpBinding 對服務的終結點進行配置。
WebHttpBehavior 行為與 WebHttpBinding 綁定一起使用時,支持 WCF 公開和訪問 Web 樣式服務。WebServiceHost 會自動將此行為添加到使用 WebHttpBinding 的終結點。例如:
<system.serviceModel> <bindings> <webHttpBinding> <binding name="RestWebBinding"> </binding> </webHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" /> <serviceDebug includeExceptionDetailInFaults="True" /> </behavior> <behavior name="RestServiceBehavior"> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="RestWebBehavior"> <!--這裡必須設置--> <webHttp /> </behavior> </endpointBehaviors> </behaviors> <services> <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior"> <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior" binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService"> </endpoint> </service> </services> </system.serviceModel>
4)WebServiceHost 和 WebServiceHostFactory:
為了支持Web編程模型,WCF框架提供一個新的宿主類型:WebServiceHost。它是一個 ServiceHost 派生類,它是對WCF Web 編程模型的補充。如果 WebServiceHost 在服務說明中找不到終結點,則它將在服務的基址中自動為 HTTP 和 HTTPS 基址創建一個預設終結點。如果用戶已在基址中明確配置終結點,則它不會自動創建終結點。WebServiceHost 會自動配置終結點的綁定,以便在安全虛擬目錄中使用時與關聯的 Internet 信息服務 (IIS) 安全設置一起使用。
WebServiceHostFactory在可動態創建WebServiceHost Web宿主實例以響應傳入消息的托管宿主環境中提供 WebServiceHost 的實例的工廠。