WCF學習之旅—實現REST服務(二十二)

来源:http://www.cnblogs.com/chillsrc/archive/2016/08/25/5806718.html
-Advertisement-
Play Games

WCF如何實現對於Rest支持的呢?弄清這一點是學習Rest WCF的關鍵。 為了實現於對Rest的支持,在 .NET Framework 中,WCF 在 System.ServiceModel.Web 組件中新增了編程模型和一些基礎架構部件。WCF Web編程模型幾個重要類型就是: ...


 一、什麼是REST

       表述性狀態轉移(Representational State Transfer,REST),不是一種標準,而是一種軟體架構風格。

       基於REST的服務與基於SOAP的服務相比,性能、效率和易用性上都更高,而SOAP協議非常的複雜和不透明。REST受到越來越多的Web服務供應商歡迎。目前大部分供應商,如淘寶、騰訊、google、Amazon等都提供REST風格的服務。

 REST的主要原則是:

 1.網路上的所有事物都可被抽象為資源;

 2.每個資源都有一個唯一的資源標識符URI;

 3.使用標準方法操作資源;

 4.所有的操作都是無狀態的;

 5.通過緩存來提高性能。

        REST (Representation State Transfer) 描 述了一個架構樣式的網路系統,比如Web應用程式。它首次出現在2000年 Roy Fielding 的博士論文中,他是HTTP規範的主 要編寫者之一。REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是 RESTful。

       使用REST做為業務邏輯介面是因為,從客戶端到伺服器的每個請求都必須包含理解請求所必需的信息。如果伺服器在請求之間的任何時間點重啟,客戶端不會得 到通知。此外,無狀態請求可以由任何可用伺服器回答,這十分適合雲計算之類的環境。客戶端可以緩存數據以改進性能。

        在伺服器端,應用程式狀態和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程式對象、資料庫記錄、演算法等等。每個 資源都使用 URI (Universal Resource Identifier) 得到一個惟一的地址。客戶端使用的是標準的 HTTP協議進行資 源訪問,同時還可以使用標準的HTTP方法,比如 GET、PUT、POST 和 DELETE。

       REST的一個重要原則是系統分層,這表示組件無法瞭解它與之交互的中間層以外的組件。通過將系統的某些功能限制在某一層,由此可以限制整個系統的複雜性,促進了底層的獨立性。

       當 REST 架構的約束條件作為一個整體應用時,將生成一個可以擴展到大量客戶端的應用程式。它還降低了客戶端和伺服器之間的交互延遲。統一界面簡化了整個系統架構,改進了子系統之間交互的可見性。REST 簡化了客戶端和伺服器的實現。

       REST的資源表述形式可以是XML、HTML、JSON,或者其他任意的形式,這取決於服務提供商和消費服務的用戶。

       但是REST不是萬能的。操作無狀態也會帶來巨大的安全問題,如何授權和驗證用戶?如果要求每次請求都包含完整的身份和驗證信息,又如何避免信息泄漏?複雜的功能挑戰架構的易用性,這就需要在性能與功能間權衡,究竟該用REST還是SOAP。  

二、Rest的優點

  1)緩存,使用 HTTP 向 RESTful 端點申請數據時,用到的 HTTP 動詞是 GET。對於 GET 請求響應中返回的資源,可以用多種不同的方式進行緩存。Conditional GET 就是可供選擇的一種實現細節,客戶端可以向服務驗證他的數據是否為最新版本;RESTful 端點可以通過它進一步提高速度和可伸縮性。

  2)擴展,REST 鼓勵每項資源包含處理特殊請求所需的所有必要狀態。滿足這一約束時,RESTful 服務更易於擴展且可以沒有狀態。

  3)副作用,使用 GET 請求資源,RESTful 服務應該沒有副作用(遺憾的是,與其他一些 REST 約束相比,這一約束更容易被打破)。

  4)冪等,統一介面另外兩個常用到的主要 HTTP 動詞是 PUT 和 DELETE。用戶代理想要修改資源時最常使用 PUT,DELETE 可以自我描述。要點(也就是“冪等”一詞所強調的)是您可以對特殊資源多次使用這兩個動詞,效果與首次使用一樣——至少不會有任何其他影響。構建可靠的分 布式系統時(即錯誤、網路故障或延遲可能導致多次執行代碼),這一優點可提供保障。

  5)互操作性許,多人將 SOAP 捧為建立客戶端-伺服器程式最具互操作性的方法。但一些語言和環境至今仍沒有 SOAP 工具包。有一些雖然有工具包,但採用的是舊標準,不能保證與使用更新標準的工具包可靠溝通。對於大多數操作,REST 僅要求有 HTTP 庫(當然,XML 庫通常也很有幫助),它的互操作性肯定強過任何 RCP 技術(包括 SOAP)。

  6)簡易性與其他優點相比,這一優點更主觀一些,不同的人可能有不同的感受。對我而言,使用 REST 的簡易性涉及到代表資源的 URI 和統一介面。作為一名 Web 衝浪高手,我理解在瀏覽器中輸入不同的 URI 可以得到不同的資源(有時也被稱為 URI 或 URL 黑客,但絕無惡意)。由於有多年使用 URI 的經驗,所以為資源設計 URI 對我來說得心應手。使用統一介面簡化了開發過程,因為我不必為每個需要建立的服務構建介面、約定或 API。介面(客戶端與我的服務交互的方式)由體繫結構約束設置。

 

三、WCF如何支持Rest

       WCF如何實現對於Rest支持的呢?弄清這一點是學習Rest WCF的關鍵。

       為了實現於對Rest的支持,在 .NET Framework 中,WCF 在 System.ServiceModel.Web 組件中新增了編程模型和一些基礎架構部件。WCF Web編程模型幾個重要類型就是:

   1)  WebGetAttribute 和 WebInvokeAttribute:

       我們知道,在WCF中,對於方法的調用是基於SOAP的Action的,每個客戶端發送的SOAP消息都需要指定一個Action 的值。這個Action的值和WCF服務的方法對應。每個WCF服務端的操作都有一個特定的Action。通過 OperationContractAttribute.Action 屬性設置。

  在Rest WCF中,基於Action的方法調用轉變為了基於URI+Http動詞的調用。也就是SOAP Action=URI+Http動詞。

  這種映射會由WebHttpDispatchOperationSelector 類型來完成,它會把客戶端請求的URI+Http動詞,映射到特定的服務方法上。

  WebGetAttribute 告訴服務方法應該響應 HTTP GET 請求。

  WebInvokeAttribute 預設映射為 HTTP POST,但可將WebInvokeAttribute.Method 屬性設置為支持所有其他 HTTP 動詞(PUT 和 DELETE 等)。例如:

     

    

   [WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)]
          [OperationContract]
          List<Books> GetBook(string BookId);

 

        [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)]
         [OperationContract]
         Result AddBook(Books book);

   2)  UriTemplate 和 UriTemplateTable:

      UriTemplate 一個表示統一資源標識符 (URI) 模板的類。可以定義服務操作的路徑和HTTP動詞。

  UriTemplateTable一個表示一組關聯 UriTemplate 對象的類。也就是UriTemplate表。

      從上面的例子代碼,我們也能看出如何使用UriTemplate 定義服務操作的URI和HTTP動詞。

 

      3)   WebHttpBinding 和 WebHttpBehavior:

       WebHttpBinding允許開發人員通過 HTTP 請求(這些請求使用“Plain old XML”(POX) 樣式消息,而不是使用基於 SOAP 的消息)來公開 WCF Web 服務,可以很便利的實現REST。

        與其他綁定不同的是:必須使用WebHttpBehavior對服務的終結點進行配置。還要求使用WebGetAttribute或WebInvokeAttribute屬性將各個服務操作映射到 URI,同時定義調用和返回結果的消息格式。

 

   WCF Web 編程模型允許開發人員通過 HTTP 請求(這些請求使用朴素的舊的“Plain old XML”(POX) 樣式消息,而不是SOAP 的消息)來公開 WCF服務。為了讓客戶端使用 HTTP 請求與服務進行通信,必須使用附加了 WebHttpBehaviorWebHttpBinding 對服務的終結點進行配置。

   WebHttpBehavior 行為與 WebHttpBinding 綁定一起使用時,支持 WCF 公開和訪問 Web 樣式服務。WebServiceHost 會自動將此行為添加到使用 WebHttpBinding 的終結點。例如:

        

<system.serviceModel>
    <bindings>
       <webHttpBinding>
         <binding name="RestWebBinding">

         </binding>

       </webHttpBinding>

     </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="True" />

        </behavior>
          <behavior name="RestServiceBehavior">

         </behavior>

      </serviceBehaviors>
       <endpointBehaviors>
         <behavior name="RestWebBehavior">
           <!--這裡必須設置-->

           <webHttp />

         </behavior>

       </endpointBehaviors>
    </behaviors>

    <services>   

      <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior">
         <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior"
                   binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService">
         </endpoint>
       </service>
    </services>
  </system.serviceModel>

 

 

   4)WebServiceHost 和 WebServiceHostFactory:

      為了支持Web編程模型,WCF框架提供一個新的宿主類型:WebServiceHost。它是一個 ServiceHost 派生類,它是對WCF Web 編程模型的補充。如果 WebServiceHost 在服務說明中找不到終結點,則它將在服務的基址中自動為 HTTP 和 HTTPS 基址創建一個預設終結點。如果用戶已在基址中明確配置終結點,則它不會自動創建終結點。WebServiceHost 會自動配置終結點的綁定,以便在安全虛擬目錄中使用時與關聯的 Internet 信息服務 (IIS) 安全設置一起使用。

  WebServiceHostFactory在可動態創建WebServiceHost Web宿主實例以響應傳入消息的托管宿主環境中提供 WebServiceHost 的實例的工廠。

     

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 在很多人或許很多技術大神都會覺得IIS的安裝和4.0沒得先後順序的。其錯誤弊端在與IIS沒有註冊到4.0上。 經過今天遇到了伺服器安裝服務端發覺報錯【無法識別的屬性“targetFramework”。請註意屬性名稱區分大小寫。錯誤解決辦法】客戶端報404錯誤,這個時候我們都會覺得沒有找到相對應的路徑 ...
  • 這幾天無意間看到一個關於分頁的帖子,覺得寫得挺好的。關於這些東西,自己一直都是只知道原理,卻沒有真正動手做過,於是研究了一下分頁的原理自己動手寫了一個十分特別非常簡單的分頁程式,在這裡與大家分享一下。 這個程式取數據使用的ado.net,首先先新建一個取數據的類PageDAl 然後記得修改一下web ...
  • 前言 在開發應用程式時,通常只讓程式運行一個實例。所以,就要判斷程式是否已經運行。 下麵是我自己在項目中使用到,封裝好的幫助類。有 普通的 C 應用程式 和 Windows CE 和 Windows Mobile 應用程式使用的方法。 主要是通過 System.Threading.Mutex 類 和 ...
  • Razor是MVC框架視圖引擎,我們今天就來說一說Razor視圖引擎。 首先還是來創建一個基礎項目叫Razor來演示。 先來定義一個Model叫Product 接著,來定義一個控制器。 最後,在Views/Home文件夾中創建Index.cshtml文件。 1. 使用模型對象 我們在視圖的第一行使用 ...
  • 舉幾個值類型和引用類型的記憶體配置: 值類型存儲在棧中,引用類型堆里: 1,數組 數組是引用類型,但是數組的元素可以是值類型或引用類型 2. 結構 結構是值類型,簡略的看個例子 struct sample { public int X; public int Y; } simple ss = new ...
  • ASP.NET Core基於 .NET Core 項目模型,它支持構建能夠運行在 Windows、Mac和 Linux 上的跨平臺應用程式。當您構建一個 .Net Core 項目的時候,您可以選擇一種 .NET框架來構建您的應用程式,.NET Framework (CLR)、 .NET Core (... ...
  • LINQ對於筆者來說, 優美而濃縮的代碼讓人震驚. 研究LINQ就是在藝術化自己的代碼. 之前只是走馬觀花學會了基本的語法, 但是經常在CSDN看到令人驚訝自嘆不如的LINQ代碼, 還是讓人羡慕嫉妒恨, 真有一種心血來潮想追趕的衝動. 所以, 還是決定系統的學習一下LINQ. (1.4) LINQ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...