Aaron Sloman和Haider Sabri在MIX08中談到了如何“使用WCF創建一個REST的API”,其中,介紹了一 個名為RESTChess的REST應用程序示例。
Aaron Sloman首先談到在WCF中支持REST的某些背景信息。接著,Haider Sabri則對REST以及REST的主 要特性進行了簡要的介紹。據Haider所說,REST提供的關鍵優勢在於:
低的學習門檻
ROA遵循了Web語義……適於Web服務的APIs
靈活多變的響應格式
他認為“如果客戶端未知,那麼在創建一個通用API時,REST是最佳選擇”。
WCF通過Web編程模型來支持REST,該模型是在.NET Framework 3.5中增加的,包括如下概念:
URI Templates & WebGet/WebInvoke
它們都是特性,用於映射HTTP請求到類中的方法。
WebHttpBinding
WebHttpBinding是WCF的一個綁定,允許WCF基於WebHttp進行內容發送。
你可以很容易地在REST和SOAP的API之間進行切換。
WebOperationContext
WebOperationContext支持以REST方式處理請求與響應。
Haider Sabri介紹了RESTChess,它是用於國際象棋游戲的REST的API。RESTChess既是一個很好的例子 ,用來展現采用WCF的Web編程模型實現的REST的API,同時又是一個擴展集(定制WCF綁定和行為),彌補了 WCF Web編程模型的缺陷:
靈活的URIs
在IIS托管服務時,服務的.svc擴展名是必備的。
RESTChess提供了一個URL的重寫器,並在IIS 7中被實現為一個HTTP模塊。
為只支持GET和POST的低級REST客戶端搭建支撐的橋梁
有兩種常見的方法可以解決這一問題:
自定義HTTP標頭
_method查詢參數
RESTChess實現了一個自定義WCF通道,可以分辨高級的和低級的REST客戶端,以及修改利用隱藏的 DELETE或PUT方法通過POST請求傳遞到適合的HTTP方法的消息。
使用數據簽名驗證請求
RESTChess使用了OAuth,它是一個包含了數據簽名的“支持安全的API驗證的開放協議”。
OAuth調用者作為查詢參數對簽名進行傳遞。
一個自定義的WCF通道負責檢查請求是否具有OAuth密鑰,如果在請求被分發給服務模型之前,調用者 沒有被驗證(密鑰不存在或者不能識別),就會拋出一個異常。
多種表現形式
WCF只支持XML和JSON。
REST的異常處理
RESTChess團隊構建了一個引擎,能夠將異常映射到適當的HTTP錯誤代碼。
雖然該團隊為WCF的Web編程模型完成了拾遺補阙的任務,但Haider則認為:“WCF的閃光之處就在於能 夠對它進行擴展、添加,以及構建在高水平的基礎之上”。