以下文章是我自已寫的筆記,主要是翻譯網路上的文章,並自已加以重點整理後的產物。以供我日後參考使用,如有錯誤請見諒~
我盡可能用圖文的方式來介紹WCF REST,必竟,看圖還是比較Restful一點,是吧。呵~
WCF Restful 重點筆記
本文將介紹以下主題:
1. VS2010 Rest 範本
2. 網路服務的根目錄
3. 路由設定
4. WebGet/WebInvoke
5. 使用fiddler測試你的網路服務
6. UriTemplate的變化
7. Help頁及Description Attribute
8. 智能選擇回傳格式或由客戶端決定回傳格式
9. 錯誤處理機制
10. 回傳快取設定
1. VS2010 REST 範本
一圖解千言,VS2010預設並沒有 REST的範本,你必須自行下載。範本的下載方式如下圖所示:
1. 打開Vs2010,在主選單\工具\擴充管理員:
2. 選擇下圖所示:
3. 安裝好之後,新增專案時會看到下圖,多了個叫WCF REST Service Application範本:
2. 網路服務的根目錄
新增範本專案後,在方案總管點擊專案,按右鍵選【屬性】,看到如下畫面
你可以在這裏設定指定的通訊埠及虛擬路徑
在方案選在瀏覽器檢視
瀏覽器會到看預設的輸出是一個xml資料,如下圖所示,注意此時url上的根目錄多了port及/Task了
3. 路由設定
1. 打開專案裏面的Global.asax.cs檔,此時會看到如下程式碼:
2. 上述程式碼代表現在根目錄(第一個參數””)對應給Service1(第三個參數)類別處理
3. 你可以根據你的需要修改上述對應關係。假設你現在修改成如下所示:
5. 那麼你執行http://localhost:24929/Task/將出現如下所示,而不是資料了
6. 如果你執行http://localhost:24929/Task/User,則因為路由設定,會進到Service1類別,因此才會出現xml
4. WebGet/WebInvoke
1. 打開Service1.cs檔,你會看到有一些方法,這些方法上面都定義了一些Attribute
2. WebGet代表對應到Http:Get的要求,而WebInvoke則對應到Http的Post, Delete, Put要求,這是REST的精神所在,透過Http的,Get, Put, Post, Delete來對應資源的查,改,增,刪
5. 使用fiddler測試你的網路服務
瀏覽器可以很簡單的送出Http:Get的要求,但其他的要求就不行了,此時你要透過Fiddler這個軟體來進行測試,Fiddler是自由軟體,你可以在Google搜尋一下就可以找到。
接下來試範如何透過Fiddler來進行Post的測式
1. 打開Service1.cs,修改Get()回傳一個SampleItem資料,如下所示;並在Get()及Update()方法中設定中斷點
2. 執行專案,並瀏覽器拷貝要測試的url, 例如http://localhost:24929/Task/User/1,此時會進入到Get方法中。
3. 將瀏覽器畫面上的Xml拷貝起來,等一下會用到
4. 打開Fiddler,將Url貼到 Request Builder頁上,將localhost為ipv4.fiddler, 並將GET改成PUT如下圖所示
6.
7. 在Request Body,貼上剛剛copy的資料
9. 在Request Headers,加入Content-Type:text/xml,如下圖所示
10. 按Execute按鈕,此時就會發現進入到PUT()方法中,此時可以檢查傳進來的參數,會是我剛剛在fiddler上的設定一樣
6. UriTemplate的變化
UriTemplate可以很多樣化。我們可以設定自已的UriTemplate來決定對應方法的參數,如下圖所示
[WebGet(UriTemplate = "Tasks?skip={skip}&top={top}&owner={userName}")]
用中括號括起來,代表是對應到類別裏面方法的參數
7. Help頁及Description Attribute
WCF4.0會自已產生出Help頁,只要在根目錄下加一個/help,就可以開啟help說明頁,如下圖所示
想要自訂義描述說明,只要在你要描述的方法加入以下Attirbute 即可,如下所示:
[Description("Returns the tasks that are owned by the team.")]
8. 智能選擇回傳格式或由客戶端決定回傳格式
WPF4自已會跟據要求來選擇回傳的格式
1. 首先打開Fiddler,如下圖括起來的設定
2. 按下Execute後,點擊左側的WebSession,然後點右下方的RAW頁簽,你會發現回傳的值變成JSON格式了
3. 如果要由客戶端自行決定回傳格式,那麼就要在方法的UriTemplate設定,例如下圖所示
5. 接下來在程式中用以下的方式來設定回傳的格式,下例會剖析format參數是否為json格式
9. 錯誤處理機制
在REST,當發生錯誤時,建議使用標準的HTTP來應用錯誤的訊息。
錯誤有二種
l 參數型別不對,例如只接受整數的參數,而傳來字串,此時回傳Http status code :400(Bad Request)
l 參數對,但沒有資料,則回傳404(Not fond)
第一種錯誤,是丟出以下異常
throw new WebFaultException<string>( string.Format( "The value '{0}' is not a valid task id. The id must be an integer.", id), HttpStatusCode.BadRequest);
第二種錯誤,是丟出以下異常
throw new WebFaultException<string>( string.Format("There is no task with the id '{0}'.", parsedId), HttpStatusCode.NotFound);
10. 回傳的快取設定
針對很少被異動的資料,我們可以打開快取來加快服務的回應速度,特別注意,如果該服務是用來進行授權或認證的,快取一定要關閉,否則會造成安全上的漏洞
只要在方法上面加上AspCatchProfile屬性,並給一個快取名稱,如下所示
[AspNetCacheProfile("UsersCollection")]
1. 打開Web.Config,找到<system.Web>元素,此時應該長這樣…
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
2. 在System.web下面加入caching元素如下所示
<system.web>
<compilation debug="true" targetFramework="4.0" />
<caching>
<outputCache enableOutputCache="true"/>
<outputCacheSettings>
<outputCacheProfiles>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
3. 在<outputCacheProfiles> 內加入以下設定
<outputCacheProfiles>
<add name="UsersCollection" location="Server" duration="60"
varyByParam="skip; top; manager" varyByHeader="Accept"/>
</outputCacheProfiles>
4. Duration的單位是秒,所以60是一分鐘。varyByParam="skip; top; manager"表示參數不一樣,就視為不同的要求,因此用不同的快取儲存。同樣的varyByHeader="Accept"代表不同的http:accept值也代表不同的快取。