asp.net core 屬性路由和約定路由的實(shí)現(xiàn)
在 ASP.NET Core 中,Web API 中的路由(Route)用于確定客戶端請(qǐng)求的 URL 與服務(wù)器端處理邏輯之間的映射關(guān)系。路由機(jī)制在 Web API 的開發(fā)中非常重要,它幫助定義和管理不同請(qǐng)求路徑如何觸發(fā)特定的控制器和操作方法。
1. 路由概述
路由在 Web API 中有兩種主要的映射方式:
- 基于屬性的路由(Attribute Routing):通過在控制器和操作方法上使用路由特性(例如
[Route]
和[HttpGet]
)來配置路由規(guī)則。 - 約定路由(Convention-Based Routing):基于約定的方式通過配置在
Startup.cs
或Program.cs
中的路由規(guī)則。
2. 基于屬性的路由(Attribute Routing)
ASP.NET Core Web API 使用屬性路由來定義 HTTP 請(qǐng)求與控制器方法之間的映射。通過在控制器和操作方法上添加路由特性,可以直接控制 API 請(qǐng)求如何被路由到特定的控制器和方法。
2.1 控制器級(jí)別的路由
通過在控制器上使用 [Route]
特性來定義路由前綴或基路徑。所有控制器中的操作方法都會(huì)基于這個(gè)前綴來創(chuàng)建 URL 路徑。
[Route("api/[controller]")] // 控制器的基礎(chǔ)路由 public class ProductsController : ControllerBase { // GET api/products [HttpGet] public IActionResult GetAllProducts() { return Ok(new { message = "獲取所有產(chǎn)品" }); } // GET api/products/{id} [HttpGet("{id}")] public IActionResult GetProduct(int id) { return Ok(new { message = $"獲取產(chǎn)品 {id}" }); } }
[Route("api/[controller]")]
會(huì)把控制器的路由前綴設(shè)置為api/products
(假設(shè)控制器名稱是ProductsController
)。[HttpGet("{id}")]
為獲取特定產(chǎn)品的方法指定一個(gè)帶有參數(shù)id
的 URL 路徑。例如,GET api/products/1
。
2.2 操作方法級(jí)別的路由
每個(gè)控制器方法可以通過單獨(dú)的路由特性來指定其對(duì)應(yīng)的 URL 路徑和 HTTP 方法。
[Route("api/[controller]")] public class ProductsController : ControllerBase { [HttpGet] // GET api/products public IActionResult GetAllProducts() { return Ok(new { message = "獲取所有產(chǎn)品" }); } [HttpGet("{id}")] // GET api/products/{id} public IActionResult GetProduct(int id) { return Ok(new { message = $"獲取產(chǎn)品 {id}" }); } [HttpPost] // POST api/products public IActionResult CreateProduct([FromBody] Product product) { return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); } }
[HttpGet("{id}")]
定義了一個(gè)帶有id
參數(shù)的 GET 請(qǐng)求,GET api/products/1
將會(huì)觸發(fā)該方法。[HttpPost]
用于處理 POST 請(qǐng)求,POST api/products
會(huì)調(diào)用CreateProduct
方法。
2.3 路由參數(shù)
- 常規(guī)參數(shù):通過
{parameterName}
來定義路由中的參數(shù)。 - 可選參數(shù):使用
?
表示路由中的參數(shù)是可選的。 - 約束參數(shù):可以對(duì)參數(shù)進(jìn)行約束,例如只接受數(shù)字或字符串。
[Route("api/products/{id:int}")] // 參數(shù) id 必須是整數(shù) public IActionResult GetProduct(int id) { return Ok(new { message = $"獲取產(chǎn)品 {id}" }); } [Route("api/products/{category?}")] // category 是可選參數(shù) public IActionResult GetProductsByCategory(string category) { return Ok(new { message = $"獲取 {category} 類別的產(chǎn)品" }); }
int
約束表示id
必須是整數(shù)。category?
表示category
是一個(gè)可選的查詢參數(shù)。
3. 約定路由(Convention-Based Routing)
ASP.NET Core 也支持通過約定來定義路由,這種方式通常在 Program.cs
或 Startup.cs
文件中的 MapControllerRoute
中配置。
3.1 默認(rèn)路由配置
在 Program.cs
或 Startup.cs
中,你可以使用約定路由配置來定義 URL 模式:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); // 約定路由配置 app.MapControllerRoute( name: "default", pattern: "api/{controller}/{action}/{id?}"); app.Run();
- 這種路由配置會(huì)生成類似
api/products/Get/1
這樣的 URL。 {controller}
會(huì)被替換為控制器名稱(不包括Controller
后綴)。{action}
會(huì)被替換為方法名稱。{id?}
是可選的參數(shù)。
3.2 匹配控制器和動(dòng)作方法
約定路由的基本配置如下所示:
[ApiController] [Route("api/[controller]")] public class ProductsController : ControllerBase { [HttpGet("{id?}")] // 默認(rèn)情況下可以訪問此路由 public IActionResult GetProduct(int? id) { if (id.HasValue) { return Ok($"獲取產(chǎn)品 ID {id.Value}"); } return Ok("獲取所有產(chǎn)品"); } [HttpPost] // 對(duì)應(yīng) POST 請(qǐng)求 public IActionResult CreateProduct([FromBody] Product product) { return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); } }
在這種配置下,GET api/products/
和 GET api/products/{id}
都能被映射到 GetProduct
方法。
4. 路由的優(yōu)先級(jí)
當(dāng)多個(gè)路由規(guī)則可以匹配同一個(gè)請(qǐng)求時(shí),ASP.NET Core 會(huì)按照以下順序匹配路由:
- 基于屬性的路由:先匹配控制器和操作方法上的特性定義的路由。
- 約定路由:然后會(huì)匹配通過約定在
Program.cs
或Startup.cs
中配置的路由。
需要注意的是,如果存在多個(gè)路由規(guī)則都可以匹配同一個(gè)請(qǐng)求,ASP.NET Core 會(huì)選擇最具體的路由規(guī)則進(jìn)行匹配。確保路由規(guī)則的優(yōu)先級(jí)設(shè)置正確是非常重要的。
5. 路由的 HTTP 方法
ASP.NET Core 中的路由是通過 HTTP 方法(GET, POST, PUT, DELETE 等)來區(qū)分的。例如,可以通過在控制器方法上使用 [HttpGet]
, [HttpPost]
, [HttpPut]
等特性來指定該方法響應(yīng)的 HTTP 請(qǐng)求類型。
[Route("api/products")] public class ProductsController : ControllerBase { [HttpGet] // GET api/products public IActionResult GetAllProducts() { return Ok(new { message = "獲取所有產(chǎn)品" }); } [HttpPost] // POST api/products public IActionResult CreateProduct([FromBody] Product product) { return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); } }
6. 路由總結(jié)
- 基于屬性的路由 提供了靈活的 URL 定義方式,適合復(fù)雜的 API 路徑。
- 約定路由 提供了基于控制器和動(dòng)作方法的默認(rèn)路由模式,簡化了 URL 的配置。
- 路由參數(shù) 可以通過路徑、查詢字符串或請(qǐng)求體傳遞,支持常規(guī)、可選、約束參數(shù)等形式。
- HTTP 方法 的特性(如
[HttpGet]
,[HttpPost]
)用于區(qū)分不同類型的請(qǐng)求。
通過合理地使用路由特性,開發(fā)者可以實(shí)現(xiàn)對(duì) API 路徑、方法、請(qǐng)求類型等的精確控制,提升 Web API 的可維護(hù)性和可擴(kuò)展性。
到此這篇關(guān)于asp.net core 屬性路由和約定路由的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)asp.net core 屬性路由和約定路由內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GridView自動(dòng)增加序號(hào)(三種實(shí)現(xiàn)方式)
第一種方式,直接在Aspx頁面GridView模板列中.這種的缺點(diǎn)是到第二頁分頁時(shí)又重新開始了,第二種方式分頁時(shí)進(jìn)行了計(jì)算,這樣會(huì)累計(jì)向下加,點(diǎn)三種放在cs代碼中2013-04-04asp.net在iframe中彈出信息并執(zhí)行跳轉(zhuǎn)問題探討
本代碼將實(shí)現(xiàn)在iframe中彈出信息并執(zhí)行跳轉(zhuǎn),感興趣的朋友可以參考下2013-04-04asp.net中一個(gè)linq分頁實(shí)現(xiàn)代碼
asp.net中一個(gè)linq分頁實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-12-12C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信
這篇文章主要為大家詳細(xì)介紹了C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信,感興趣的小伙伴們可以參考一下2016-08-08.Net Core導(dǎo)入千萬級(jí)數(shù)據(jù)至Mysql數(shù)據(jù)庫的實(shí)現(xiàn)方法
今天我們談?wù)凪ySQL怎么高性能插入千萬級(jí)的數(shù)據(jù)的,討論這個(gè)問題牽扯到一個(gè)數(shù)據(jù)遷移功能,高性能的插入數(shù)據(jù),接下來通過本文給大家分享幾種實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2021-05-05