ASP.NET Routing路由

一、
在ASP.NET Core中,路由是用于匹配传入的HTTP请求并将这些请求发送到应用中可执行的终结点的机制,ASP.NET Core中的路由系统是基于中间件实现的,主要通过UseRouting和UseEndpoints两个中间件来配置。UseRouting负责向管道添加路由配置,而UseEndpoints则负责向管道添加终结点执行。
二、路由模板
路由模板定义了URL的模式,并指定了处理请求的控制器和方法,以下是一些常见的路由模板示例:
| 路由模板 | 示例匹配URI | 说明 |
hello |
/hello |
仅匹配单个路径/hello |
hello/{name:minlength(4)} |
/hello/jim 不匹配/hello/jimm 匹配 |
name最小长度为4 |
files/{filename}.{ext?} |
/files/a.txt/files/a |
可选的文件扩展名 |
{Page=Home} |
/ 匹配并将Page 设置为默认值Home |
|
{Page=Home} |
/Contact 匹配并将Page 设置为Contact |
|
{controller}/{action}/{id?} |
/Products/List |
映射到 Products 控制器和 List 操作 |
{controller}/{action}/{id?} |
/Products/Details/123 |
映射到 Products 控制器和 Details 操作,并将id 设置为 123 |
{controller=Home}/{action=Index}/{id?} |
/ 映射到 Home 控制器和 Index 方法 |
|
{controller=Home}/{action=Index}/{id?} |
/Products 映射到 Products 控制器和 Index 方法 |
三、路由约束
路由约束用于限制变量的匹配范围,例如只允许特定类型的数据,常见的路由约束包括:
| 约束 | 示例 | 匹配项示例 | 说明 |
int |
{id:int} |
123456789,-123456789 |
匹配任何整数 |
bool |
{active:bool} |
true,FALSE |
匹配 true 或 false,不区分大小写 |
datetime |
{dob:datetime} |
2016-12-31,2016-12-31 7:32pm |
匹配有效的 DateTime 值 |
decimal |
{price:decimal} |
49.99,-1,000.01 |
匹配有效的小数值 |
double |
{weight:double} |
1.234,-1,001.01e8 |
匹配有效的双精度浮点数 |
float |
{weight:float} |
1.234,-1,001.01e8 |
匹配有效的单精度浮点数 |
guid |
{id:guid} |
CD2C1638-1638-72D5-1638-DEADBEEF1638 |
匹配有效的 Guid 值 |
long |
{ticks:long} |
123456789 |
匹配有效的长整型值 |
四、路由中间件
ASP.NET Core中的路由功能是通过中间件实现的,以下是两个关键的中间件:
UseRouting中间件
UseRouting中间件用于向管道添加路由匹配中间件,它查看应用中定义的终结点***,然后根据请求选择最佳配置,该中间件会检查传入的HTTP请求,并根据路由模板匹配相应的终结点。

UseEndpoints中间件
UseEndpoints中间件用于向管道添加终结点执行中间件,它负责运行与所选终结点关联的委托,该中间件会执行由UseRouting中间件选择的终结点所关联的委托。
五、传统路由与属性路由
传统路由
传统路由是一种基于约定的路由方式,需要在启动时静态定义路由规则,这种方式简单易用,性能较高,但不够灵活,无法满足复杂的路由需求。
示例:
app.MapGet("/", () => "Hello World!");
属性路由
属性路由是一种基于属性的路由方式,通过在控制器类和操作方法上应用特定的属性来定义路由规则,这种方式更加灵活,可以满足复杂的路由需求,但相对复杂,需要一定的学习成本。
在Controller上使用Attribute路由
可以在控制器类上使用[Route]属性来定义控制器级别的路由规则。
[Route("api/[controller]")]
public class UsersController : Controller
{
[HttpGet]
public IActionResult Get()
{
return Ok();
}
[HttpGet("{id}")]
public IActionResult Get(int id)
{
return Ok();
}
}
在Action上使用Attribute路由
可以在操作方法上使用[HttpGet],[HttpPost],[HttpPut],[HttpDelete],[HttpPatch],[AcceptVerbs]等属性来定义操作方法级别的路由规则。

[HttpGet("{id:int}")]
public IActionResult GetUser(int id)
{
// ...
}
[HttpPost]
[Route("users/create")]
public IActionResult CreateUser(UserViewModel model)
{
// ...
}
六、路由变体
HTTP谓词
可以通过使用HTTP谓词属性如[HttpGet],[HttpPut],[HttpPost],[HttpDelete],[HttpHead],[HttpOptions],[HttpPatch]来显式指定操作的HTTP谓词,如果需要允许多个HTTP谓词,可以使用[AcceptVerbs]属性。
[AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) { }
按操作名称路由
除了使用HTTP谓词外,还可以创建按操作名称进行路由的规则,这通常用于Web API项目中,以便更灵活地处理不同的HTTP请求。
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在这种情况下,操作名称将包含在URI中,并且可以通过属性指定允许的HTTP谓词。
[ActionName("FindProduct")]
[HttpGet]
public Product FindProduct(id) { }
这种灵活性使得开发者可以根据项目需求选择最合适的路由策略,无论是简单的网站还是复杂的企业级应用,ASP.NET Core的路由系统都能提供强大的支持,通过合理配置和使用路由,可以构建出高效且易于维护的应用。
以上就是关于“ASP.NET Routing路由”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!