asp.net core 屬性路由和約定路由的實(shí)現(xiàn)
在 ASP.NET Core 中,Web API 中的路由(Route)用于確定客戶端請(qǐng)求的 URL 與服務(wù)器端處理邏輯之間的映射關(guān)系。路由機(jī)制在 Web API 的開(kāi)發(fā)中非常重要,它幫助定義和管理不同請(qǐng)求路徑如何觸發(fā)特定的控制器和操作方法。
1. 路由概述
路由在 Web API 中有兩種主要的映射方式:
- 基于屬性的路由(Attribute Routing):通過(guò)在控制器和操作方法上使用路由特性(例如
[Route]和[HttpGet])來(lái)配置路由規(guī)則。 - 約定路由(Convention-Based Routing):基于約定的方式通過(guò)配置在
Startup.cs或Program.cs中的路由規(guī)則。
2. 基于屬性的路由(Attribute Routing)
ASP.NET Core Web API 使用屬性路由來(lái)定義 HTTP 請(qǐng)求與控制器方法之間的映射。通過(guò)在控制器和操作方法上添加路由特性,可以直接控制 API 請(qǐng)求如何被路由到特定的控制器和方法。
2.1 控制器級(jí)別的路由
通過(guò)在控制器上使用 [Route] 特性來(lái)定義路由前綴或基路徑。所有控制器中的操作方法都會(huì)基于這個(gè)前綴來(lái)創(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è)控制器方法可以通過(guò)單獨(dú)的路由特性來(lái)指定其對(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ù):通過(guò)
{parameterName}來(lái)定義路由中的參數(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 也支持通過(guò)約定來(lái)定義路由,這種方式通常在 Program.cs 或 Startup.cs 文件中的 MapControllerRoute 中配置。
3.1 默認(rèn)路由配置
在 Program.cs 或 Startup.cs 中,你可以使用約定路由配置來(lái)定義 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)情況下可以訪問(wè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ì)匹配通過(guò)約定在
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 中的路由是通過(guò) HTTP 方法(GET, POST, PUT, DELETE 等)來(lái)區(qū)分的。例如,可以通過(guò)在控制器方法上使用 [HttpGet], [HttpPost], [HttpPut] 等特性來(lái)指定該方法響應(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)路由模式,簡(jiǎn)化了 URL 的配置。
- 路由參數(shù) 可以通過(guò)路徑、查詢字符串或請(qǐng)求體傳遞,支持常規(guī)、可選、約束參數(shù)等形式。
- HTTP 方法 的特性(如
[HttpGet],[HttpPost])用于區(qū)分不同類型的請(qǐng)求。
通過(guò)合理地使用路由特性,開(kāi)發(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)文章希望大家以后多多支持腳本之家!
- 詳解ASP.NET WEB API 之屬性路由
- ASP.NET?Core?MVC路由(Routing)的用法
- ASP.NET Core中的Razor頁(yè)面實(shí)現(xiàn)路由功能
- ASP.NET?Core使用功能開(kāi)關(guān)控制路由訪問(wèn)操作(續(xù))
- ASP.NET?Core使用功能開(kāi)關(guān)控制路由訪問(wèn)操作
- Asp.net Core 如何設(shè)置黑白名單(路由限制)
- 詳解ASP.NET Core端點(diǎn)路由的作用原理
- ASP.NET Core中自定義路由約束的實(shí)現(xiàn)
- asp.net core webapi項(xiàng)目配置全局路由的方法示例
相關(guān)文章
詳解.NET中的加密算法總結(jié)(自定義加密Helper類續(xù))
這篇文章主要介紹了詳解.NET中的加密算法總結(jié)(自定義加密Helper類續(xù)) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
Asp.Net如何將多個(gè)RadioButton指定在一個(gè)組中
將多個(gè)RadioButton指定在一個(gè)組中,實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,一句代碼即可,具體如下,希望對(duì)大家有所幫助2013-12-12
總結(jié)Visual Studio下ASP.NET模板化控件中的數(shù)據(jù)綁定
.NET框架中提供了很多數(shù)據(jù)綁定的組件,這里我們就來(lái)總結(jié)Visual Studio下ASP.NET模板化控件中的數(shù)據(jù)綁定,需要的朋友可以參考下2016-06-06
ASP.NET對(duì)路徑"xxxxx"的訪問(wèn)被拒絕的解決方法小結(jié)
異常詳細(xì)信息: System.UnauthorizedAccessException: 對(duì)路徑“D:/temp1/MyTest.txt”的訪問(wèn)被拒絕2012-09-09
ASP.NET實(shí)現(xiàn)讀取Excel內(nèi)容并在Web上顯示
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)讀取Excel內(nèi)容并在Web上顯示,很實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-08-08
VS2017做為Unity3D的腳本編輯器需要的最精簡(jiǎn)組件
這篇文章主要為大家詳細(xì)介紹了VS2017做為Unity3D的腳本編輯器需要的最精簡(jiǎn)組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
ASP.NET中MVC使用AJAX調(diào)用JsonResult方法并返回自定義錯(cuò)誤信息
這篇文章主要介紹了ASP.NET中MVC使用AJAX調(diào)用JsonResult方法并返回自定義錯(cuò)誤信息的相關(guān)資料,需要的朋友可以參考下2014-11-11
.net?6項(xiàng)目實(shí)現(xiàn)壓縮發(fā)布
這篇文章介紹了.net?6項(xiàng)目實(shí)現(xiàn)壓縮發(fā)布的方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

