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

  • 相关阅读:
    delphi shr和shl的作用
    delphi socket 编程 使用多线程
    mysql 移除服务,并在cmd下切换目录
    delphi 结构体和TList的用法
    delphi 使用工控机控件 iThreadTimes 出现问题, 导致主程序创建页面的时候, 阻塞消息, 不能正常执行。
    Unicode 和 UTF-8 的区别
    Python 模块 re (Regular Expression)
    Python的函数式编程
    反向解析与PTR(Pointer Record)
    simhash算法
  • 原文地址:https://www.cnblogs.com/goody9807/p/2404265.html
Copyright © 2020-2023  润新知