asp.net core 屬性路由和約定路由的實(shí)現(xiàn)
在 ASP.NET Core 中,Web API 中的路由(Route)用于確定客戶端請求的 URL 與服務(wù)器端處理邏輯之間的映射關(guān)系。路由機(jī)制在 Web API 的開發(fā)中非常重要,它幫助定義和管理不同請求路徑如何觸發(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 請求與控制器方法之間的映射。通過在控制器和操作方法上添加路由特性,可以直接控制 API 請求如何被路由到特定的控制器和方法。
2.1 控制器級別的路由
通過在控制器上使用 [Route] 特性來定義路由前綴或基路徑。所有控制器中的操作方法都會基于這個前綴來創(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]")]會把控制器的路由前綴設(shè)置為api/products(假設(shè)控制器名稱是ProductsController)。[HttpGet("{id}")]為獲取特定產(chǎn)品的方法指定一個帶有參數(shù)id的 URL 路徑。例如,GET api/products/1。
2.2 操作方法級別的路由
每個控制器方法可以通過單獨(dú)的路由特性來指定其對應(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}")]定義了一個帶有id參數(shù)的 GET 請求,GET api/products/1將會觸發(fā)該方法。[HttpPost]用于處理 POST 請求,POST api/products會調(diào)用CreateProduct方法。
2.3 路由參數(shù)
- 常規(guī)參數(shù):通過
{parameterName}來定義路由中的參數(shù)。 - 可選參數(shù):使用
?表示路由中的參數(shù)是可選的。 - 約束參數(shù):可以對參數(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是一個可選的查詢參數(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();- 這種路由配置會生成類似
api/products/Get/1這樣的 URL。 {controller}會被替換為控制器名稱(不包括Controller后綴)。{action}會被替換為方法名稱。{id?}是可選的參數(shù)。
3.2 匹配控制器和動作方法
約定路由的基本配置如下所示:
[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]
// 對應(yīng) POST 請求
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)先級
當(dāng)多個路由規(guī)則可以匹配同一個請求時,ASP.NET Core 會按照以下順序匹配路由:
- 基于屬性的路由:先匹配控制器和操作方法上的特性定義的路由。
- 約定路由:然后會匹配通過約定在
Program.cs或Startup.cs中配置的路由。
需要注意的是,如果存在多個路由規(guī)則都可以匹配同一個請求,ASP.NET Core 會選擇最具體的路由規(guī)則進(jìn)行匹配。確保路由規(guī)則的優(yōu)先級設(shè)置正確是非常重要的。
5. 路由的 HTTP 方法
ASP.NET Core 中的路由是通過 HTTP 方法(GET, POST, PUT, DELETE 等)來區(qū)分的。例如,可以通過在控制器方法上使用 [HttpGet], [HttpPost], [HttpPut] 等特性來指定該方法響應(yīng)的 HTTP 請求類型。
[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 路徑。
- 約定路由 提供了基于控制器和動作方法的默認(rèn)路由模式,簡化了 URL 的配置。
- 路由參數(shù) 可以通過路徑、查詢字符串或請求體傳遞,支持常規(guī)、可選、約束參數(shù)等形式。
- HTTP 方法 的特性(如
[HttpGet],[HttpPost])用于區(qū)分不同類型的請求。
通過合理地使用路由特性,開發(fā)者可以實(shí)現(xiàn)對 API 路徑、方法、請求類型等的精確控制,提升 Web API 的可維護(hù)性和可擴(kuò)展性。
到此這篇關(guān)于asp.net core 屬性路由和約定路由的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)asp.net core 屬性路由和約定路由內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解.NET中的加密算法總結(jié)(自定義加密Helper類續(xù))
這篇文章主要介紹了詳解.NET中的加密算法總結(jié)(自定義加密Helper類續(xù)) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12
Asp.Net如何將多個RadioButton指定在一個組中
將多個RadioButton指定在一個組中,實(shí)現(xiàn)其實(shí)很簡單,一句代碼即可,具體如下,希望對大家有所幫助2013-12-12
總結(jié)Visual Studio下ASP.NET模板化控件中的數(shù)據(jù)綁定
.NET框架中提供了很多數(shù)據(jù)綁定的組件,這里我們就來總結(jié)Visual Studio下ASP.NET模板化控件中的數(shù)據(jù)綁定,需要的朋友可以參考下2016-06-06
ASP.NET對路徑"xxxxx"的訪問被拒絕的解決方法小結(jié)
異常詳細(xì)信息: System.UnauthorizedAccessException: 對路徑“D:/temp1/MyTest.txt”的訪問被拒絕2012-09-09
ASP.NET實(shí)現(xiàn)讀取Excel內(nèi)容并在Web上顯示
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)讀取Excel內(nèi)容并在Web上顯示,很實(shí)用的一個技巧,需要的朋友可以參考下2014-08-08
ASP.NET中MVC使用AJAX調(diào)用JsonResult方法并返回自定義錯誤信息
這篇文章主要介紹了ASP.NET中MVC使用AJAX調(diào)用JsonResult方法并返回自定義錯誤信息的相關(guān)資料,需要的朋友可以參考下2014-11-11

