如何利用ASP.NET Routing实现灵活的URL路由配置?
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路由”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!