2008年11月15日 星期六

以WCF來開發RESTful風格的服務

  在上周『從Web Service到RESTful WCF的心情』一文中,我提到了對REST的感想,而這一篇,則是介紹.NET 3.5 中對REST的支援,說明如何透過WCF開發RESTful服務,不過,當.NET開發人員要透過WCF來開發RESTful的服務之前,有一些基本的觀念需要釐清。所謂的REST技術,其精神是透過Uri來描述存在於網際網路上的資源,例如:

    http://www.studyhost.com/Eshop/Products/Nokia5130

  上面這串網址可表示一個產品資料表中的產品,產品名稱為Nokia5130,若我們想取得資料,可透過HTTP GET方法,以上述網址來取得。

  若我們想刪除這個資料,則一樣是上面這串網址,但是對IIS伺服器送出的動作則是HTTP DELETE。如果我們想建立一筆新的資料,則可透過HTTP POST方法,至於要修改,則透過HTTP PUT方法。

  也就是說,描述資源是透過Uri,而對資源要進行的動作,則是透過HTTP verb來進行。有了這樣的觀念之後,我們就可以開始嘗試建議建立RESTful的 WCF服務。我們建立出的WCF服務,只需要遵循上述的 REST風格,即可讓所有的開發人員存取。  

  一直說REST風格而不說REST規格,主要的原因是REST並非是一種哪一個機構或是協會設計出來的規格,由於架構簡單,它僅僅是一種設計風格,就是兩個要點,用Uri來描述資源位置,用四種Http Verbs(包含GET, POST, DELETE, PUT)來決定對這個資源要進行的動作,甚至當我們用調用某一個RESTful的服務時,該服務回傳的資料也沒有一定要以XML型別回傳,也可以是單純的文字或是HTML。總而言之,它就是簡單導向。

  而HTTP Verbs到底是什麼呢?這對於絕大部分時間僅僅使用瀏覽器的開發人員來說,可能有點陌生,HTTP Verbs是HTTP協議定義出的規格,HTTP共有八種動作,包含:HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT,過去我們常用且熟悉的應該是HTTP GET和HTTP POST,當你在瀏覽器上輸入一個網址,對於IIS伺服器下的指令其實就是HTTP GET,而當你在瀏覽器上按下某一個Submit按鈕(或是ASP.NET的postback),其實就是對瀏覽器下HTTP POST指令。

實際建立RESTful的WCF服務

  由於.NET 3.5的支援,我們可以透過相當簡單的方式來建立RESTful的WCF服務,若開發人員想透過WCF技術,來開發RESTful的Service,只需要在VS2008 SP1的專案範本中,選擇AJAX-enabled WCF Service即可:

接著,您會看到底下的程式碼:


  如果您將最上面註解的『WebGet()』槓掉,該服務就會是一個RESTful的服務,支援 HTTP GET方式。

  不過要讓這個服務能夠正式運行之前,我們必須針對Web.Config作一些調整,請把區段中的『enableWebScript』取消:


  另外,請開啟RESTfulWCF.svc檔案,在.svc頁面的網頁前置詞當中,加入『Factory="System.ServiceModel.Activation.WebServiceHostFactory"』,如此一來,這個RESTful服務才能夠正常運行:


  有了這些概念之後,我們立刻來嘗試建立一個簡單的例子,請建立一個GetData Method,該Method具有一個參數Name,接著在Method上,加入WebGet修飾字,給定UriTemplate即可,相當的簡單:


  UriTemplate是指這一個RESTful服務的呼叫方式(嚴格說起來是描述該資源的Uri位置),是要以何種Uri來表達,透過這種方式建立出來的WCF服務,就直接支援了REST型態的遠端呼叫方式。
  例如,上例中我們給定的『UriTemplate』是"User/{name}",則這個資源可以透過底下的網址來取得:

http://localhost:56712/RESTfulWCF.svc/user/david

  其中的『david』是UriTemplate中的{name}參數,而這個參數可透過我們定義在GetData()中的name參數取得,目前我們在GetData()中僅是將這個參數加上一些文字然後回傳,表示回應了用戶端對資料的呼叫,而呈現出的結果如下圖。我們可以在瀏覽器上直接以HTTP GET來測試:

  很簡單的,就建立了一個RESTful的服務。

6 則留言:

Wizard 提到...

歐萊禮有一本「RESTful .NET」:
http://oreilly.com/catalog/9780596519209/


感覺像微軟將來的 ADO.NET Data Services

David 提到...

to Wizard,
thx, 我改天找來看看^_^

gattaca 提到...

在WebService(asmx)中有Context.Response可以while迴圈持續寫入視訊串流資料
===========================
[WebMethod]
public void getLiveView()
{
...
while (DateTime.Now < playEndTime)
{
byte[] frame = getOneFrame();
Context.Response.BinaryWrite(frame);
Context.Response.Flush();
Thread.Sleep(100);
}
...
}
===========================


但是在REST WCF中卻沒有相對應的方式,
WebOperationContext.Current.OutgoingResponse無法BinaryWrite與Flush,
請問在REST WCF中有類似的方式嗎?

WizardWu 提到...

增進 Web Services 安全、WCF Security Guide - v1 (msdn, Patterns & Practices),
微軟官方 689 頁, 全文 pdf 電子檔下載:
http://www.codeplex.com/WCFSecurityGuide

線上版:
http://msdn.microsoft.com/en-us/library/cc949034.aspx

其他相關文件:
http://www.cnblogs.com/wayfarer/archive/2009/02/14/1390556.html
http://blogs.msdn.com/jmeier/archive/2009/02/11/new-release-patterns-practices-wcf-security-guide.aspx
http://blogs.msdn.com/jmeier/default.aspx (作者本人)

微軟 WCF 3.5 官方教材 (適合第一次學 WCF 的人):
http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=0735625654&sid=46569

-----------------------------------

傻瓜也能在 24 小時學會 WF, Windows Workflow Foundation (照書上一步步照做即可):
Sams Teach Yourself Windows Workflow Foundation in 24 Hours
http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=0321486994&sid=48858

WF 簡體線上教材,一步步照做即可:
http://www.cnblogs.com/carysun/archive/2008/04/04/WFHelloWorld.html

-----------------------------------

匿名 提到...

i am new to sliverlight, would you write more detaily? since from "我們立刻來嘗試建立一個簡單的例子,請建立一個GetData Method" don't really know where to put.

thank u

匿名 提到...

所以,請問版主,透過 wcf restful,
其實我們就可以直接透過 網址取得資料了?