WCF4.0 + Restful +VS2010 圖文重點筆記

以下文章是我自已寫的筆記,主要是翻譯網路上的文章,並自已加以重點整理後的產物。以供我日後參考使用,如有錯誤請見諒~

我盡可能用圖文的方式來介紹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,在主選單\工具\擴充管理員:

clip_image002

2. 選擇下圖所示:

clip_image004

3. 安裝好之後,新增專案時會看到下圖,多了個叫WCF REST Service Application範本:

clip_image006

2. 網路服務的根目錄

新增範本專案後,在方案總管點擊專案,按右鍵選【屬性】,看到如下畫面

clip_image008

你可以在這裏設定指定的通訊埠及虛擬路徑

在方案選在瀏覽器檢視

clip_image010

瀏覽器會到看預設的輸出是一個xml資料,如下圖所示,注意此時url上的根目錄多了port及/Task了

clip_image012

3. 路由設定

1. 打開專案裏面的Global.asax.cs檔,此時會看到如下程式碼:

clip_image014

2. 上述程式碼代表現在根目錄(第一個參數””)對應給Service1(第三個參數)類別處理

3. 你可以根據你的需要修改上述對應關係。假設你現在修改成如下所示:

4. clip_image016

5. 那麼你執行http://localhost:24929/Task/將出現如下所示,而不是資料了

clip_image018

6. 如果你執行http://localhost:24929/Task/User,則因為路由設定,會進到Service1類別,因此才會出現xml

clip_image020

 

4. WebGet/WebInvoke

1. 打開Service1.cs檔,你會看到有一些方法,這些方法上面都定義了一些Attribute

2. WebGet代表對應到Http:Get的要求,而WebInvoke則對應到Http的Post, Delete, Put要求,這是REST的精神所在,透過Http的,Get, Put, Post, Delete來對應資源的查,改,增,刪

clip_image022

5. 使用fiddler測試你的網路服務

瀏覽器可以很簡單的送出Http:Get的要求,但其他的要求就不行了,此時你要透過Fiddler這個軟體來進行測試,Fiddler是自由軟體,你可以在Google搜尋一下就可以找到。

接下來試範如何透過Fiddler來進行Post的測式

1. 打開Service1.cs,修改Get()回傳一個SampleItem資料,如下所示;並在Get()及Update()方法中設定中斷點

clip_image024

2. 執行專案,並瀏覽器拷貝要測試的url, 例如http://localhost:24929/Task/User/1,此時會進入到Get方法中。

3. 將瀏覽器畫面上的Xml拷貝起來,等一下會用到

clip_image026

4. 打開Fiddler,將Url貼到 Request Builder頁上,將localhost為ipv4.fiddler, 並將GET改成PUT如下圖所示

5. clip_image028

6.

7. 在Request Body,貼上剛剛copy的資料

8. clip_image030

9. 在Request Headers,加入Content-Type:text/xml,如下圖所示

clip_image032

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說明頁,如下圖所示

clip_image034

想要自訂義描述說明,只要在你要描述的方法加入以下Attirbute 即可,如下所示:

[Description("Returns the tasks that are owned by the team.")]

8. 智能選擇回傳格式或由客戶端決定回傳格式

WPF4自已會跟據要求來選擇回傳的格式

1. 首先打開Fiddler,如下圖括起來的設定

clip_image036

2. 按下Execute後,點擊左側的WebSession,然後點右下方的RAW頁簽,你會發現回傳的值變成JSON格式了

clip_image038

3. 如果要由客戶端自行決定回傳格式,那麼就要在方法的UriTemplate設定,例如下圖所示

4. clip_image040

5. 接下來在程式中用以下的方式來設定回傳的格式,下例會剖析format參數是否為json格式

clip_image042

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值也代表不同的快取。

posted @ 2012-03-18 01:49  PointNet  阅读(1973)  评论(0编辑  收藏  举报