[水煮 ASP.NET Web API2 方法論](3-2)直接式路由/屬性路由

来源:http://www.cnblogs.com/shuizhucode/archive/2016/11/25/6099845.html
-Advertisement-
Play Games

問題 怎麼樣可以使用更貼近資源(Controller,Action)的方式定義路由。 解決方案 可以使用屬性路由直接在資源級別聲明路由。只要簡單的在 Action 上使用屬性路由 RouteAttribute,然後傳一個相關路由模板就可以。屬性路由與集中式路由在路由模板含義上基本是一樣的,所有路由參 ...


問題

怎麼樣可以使用更貼近資源(Controller,Action)的方式定義路由。

 

解決方案

可以使用屬性路由直接在資源級別聲明路由。只要簡單的在 Action 上使用屬性路由 RouteAttribute,然後傳一個相關路由模板就可以。屬性路由與集中式路由在路由模板含義上基本是一樣的,所有路由參數應該使用花括弧,同時要與使用的 Action 相匹配。直接式路由支持預設路由,可選參數,約束。詳細分析請往下走。

1 [Route("api/teams/{id}")]
2 public Team GetTeam(int id)
3 {
4     //忽略邏輯
5 }

 

要是啟用屬性路由的話,需要在應用程式啟動的位置,使用 HttpConfiguration 調用 MapAttributeRoutes 的擴展方法。

Config.MapHttpAttributeRoutes();

 

工作原理

一個叫做 Attribute Routing 的開源類庫已經成為了 ASP.NET WEB API 2 架構的核心部分。隨之而來的是,解決了集中式路由在維護上給我們帶來的痛苦,允許我們直接在 Controller 和 Action 上聲明路由。

 

對於大多數開發者來說,與集中式路由相比,屬性路由(上面所說的直接路由)是更加自然的方法,屬性路由強調的是 WEB API 資源和 URI 之間的直接關係,URI 資源應該是可以通過 HTTP 直接訪問。事實上,還是有一些流行的 .NET Web 框架,例如,ServiceStack、NancyFx 都有自己的方式來定義這種貼近資源的路由(嵌入資源)。

 

在應用程式啟動時,調用 MapHtpAtrributeRoutes,其實是告訴 ASP.NET WEB API 掃描所有 Controller 上聲明的屬性路由。

 

究其緣由,屬性路由的聲明和集中式路由沒有太大的區別。而且,他們的路由都是被添加到與前面上一篇集中式路由代碼片段 3-1 一樣的路由集合中。最大的不同就是,直接式路由(屬性路由)是作為單一複合路由(內部的 SubRouteCollection 類型)被添加到路由集合中的,使用的路由 key 是 MS_attributerouteWebApi。

 

處理每個屬性路由的時候,Controller(HttpControllerDescriptor)或 Action(HttpActionDescriptor)會標記出能夠訪問到的屬性路由。這個過程的完成是通過在這些 descriptor 類型的 Properties 字典中添加 MS_IsAttributeRouted。

 

屬性路由提供了一些路由自定義處理。事實上,不必強制在 Controller 和 Action 上使用 RouteAttribue 聲明路由。通過實現 IDirectRouteFactory,可以自定義屬性路由、甚至無屬性路由,集中式邏輯路由。IDirectRouteFactory 的使用 和 IDirectRouteProvider 會在後面的 3-11 篇和 6-8 篇的時候再次討論。

 

代碼演示

與集中式路由相反,屬性路由顯得很自然,直接展示了 Controller 和 Action 之間的關係,也很容易聲明複雜的路由。如代碼片段 3-4 例子所示。

 

代碼片段 3-4. 聲明簡單的屬性路由

 1 public class TeamsController : ApiController
 2 {
 3     [Route("api/teams/{id}")]
 4     public Team GetTeam(int id)
 5     {
 6         //忽略邏輯
 7     }
 8  
 9     [Route("api/teams")]
10     public IEnumerable<Team> GetTeams()
11     {
12         //忽略邏輯
13     }
14  
15     [Route("api/teams/{teamId}/players")]
16     public IEnumerable<Player> GetPlayers(int teamId)
17     {
18         //忽略邏輯
19     }
20 }

 

屬性路由也允許通過 RoutePrefixAttribute 定義路由首碼。但,只能在 Controller 級別聲明,修改代碼片段 3-4,為這個 Controller 中所有的路由定義一個公用首碼。使用 RoutePrefixAttribute 重寫,如代碼片段 3-5 所示。需要註意的是,當路由被顯示的時候,所有在 Action 上指定的 RouteAttribute 是路由模板的一部分,被拼接在 RoutePrefixAttribute 之後。

 

代碼片段 3-5. 屬性路由和路由首碼

 1 [RoutePrefix("api/teams")]
 2 public class TeamsController : ApiController
 3 {
 4     [Route("{id}")]
 5     public Team GetTeam(int id)
 6     {
 7         // 忽略邏輯
 8     }
 9  
10     [Route]
11     public IEnumerable<Team> GetTeams()
12     {
13         // 忽略邏輯
14     }
15  
16     [Route("{teamId}/players")]
17     public IEnumerable<Player> GetPlayers(int teamId)
18     {
19         // 忽略邏輯
20     }
21 }

 

與集中式路由相同的是,屬性路由也是依賴 HTTP 謂詞分發。所以,由於對路由定義命名的約定(上一篇描述了 HTTP 謂詞分發),代碼片段 3-4 和 3-5 只能處理 HTTP GET 請求。

 

為了可以支持其他 HTTP 謂詞類型,再在 Controller 中加幾個 Action ,命名的時候,首碼使用 HTTP 謂詞相關的動詞或者標簽。代碼片段 3-6 有 POST 和 PUT 兩個類型的 Action。他們都擴展了 TeamsController 的功能,可以創建 Team 資源,創建一個 Player 資源到一個給定的 Team 中,這兩個都是 POST,以及一個更新 Team 的操作(PUT)。

 

代碼片段 3-6. 補充定義,支持其他的 HTTP 謂詞

 1 [Route]
 2 public HttpResponseMessage PostTeam(Team team)
 3 {
 4     // 忽略邏輯
 5 }
 6 [HttpPost]
 7 [Route("{teamId}/players")]
 8 public HttpResponseMessage AddPlayer(int teamId, Player player)
 9 {
10     // 忽略邏輯
11 }
12 [Route("{id}")]
13 public HttpResponseMessage PutTeam(int id, Team team)
14 {
15     // 忽略邏輯
16 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 1. Background Need to check if the RSA encryption result from the POS application is correct, I want to use the openssl library in Linux to encrypt th ...
  • 1.查看目錄 Ctrl+L 2.在終端下:複製命令:Ctrl + Shift + C 組合鍵.粘貼命令:Ctrl + Shift + V 組合鍵. 3.解壓 tar xzf flie.tar.gz 4.mkdir 文件夾 --/創建一個文件夾rmdir 空文件夾名 --/刪除一個空文件夾rm 文件名 ...
  • 上一遍又說到Godaddy 生請證書流程與操作; 現因使用Incapsula 防護使用到https,在添加網站時需要自定義證書,其中需要上傳私鑰信息,因公鑰是能過keytool 生成所以需要導出私鑰信息; 導出的步驟如下: 一:安裝openssl and openssl-devel: 二:能過key ...
  • centos7 字元界面操作基礎 1.字元界面的使用方法 2.本地登錄和遠程登錄 3.學會使用putty 4.理解系統運行級別及其切換方法 5.掌握常用的系統關機和重啟命令 為什麼使用字元工作方式? 1.在字元操作方式下可以高效的完成所有的任務,尤其是系統管理任務。 2.系統管理任務通常都是遠程進行 ...
  • Hyper-V是微軟的管理虛擬機(Virtual Machine)的服務,在安裝Hyper-V功能之後,系統自動安裝可視化的虛擬機管理工具:Hyper-V Manager。在同一臺物理機上,能夠使用Hyper-V創建多個虛擬機(VM),每一個VM執行不同的工作負載(workload),運行單獨的系統 ...
  • linux的特點 優點: 1、免費的/開源的系統 2、支持多線程/多用戶的系統 3、安全性好 4、對記憶體和文件管理優越 5、提供了豐富的網路功能 6、良好的用戶界面。圖形化界面和字元型界面 linux體積最少只需要記憶體4M,由於小所以可以做嵌入式開發 linux系統的組成: 內核:是系統的心臟,實現 ...
  • 若虛擬機在不正常關機的時候會遇到如下圖所示的問題:先點擊“取消”按鈕 解決方法:打開“資源管理器”,進入到彈出提示視窗所在的路徑(即H:\VMware\Virtual Machines Documents\CentOS),在這裡找到CentOS.vmx.lck文件夾,然後將尾碼名.lck的文件夾刪除 ...
  • 1.參照Zabbix文檔配置 依照官方文檔配置,沒什麼說的。 zabbix官方文檔:https://www.zabbix.com/documentation/3.2/manual/vm_monitoring 2.遇到的問題 這裡主要介紹我遇到的問題。由於理解偏差,文檔中的sdk,我以為是sdk的意思... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...