如何利用ASP.NET Routing实现灵活的URL路由配置?

ASP.NET Routing路由

如何利用ASP.NET Routing实现灵活的URL路由配置?

一、

在ASP.NET Core中,路由是用于匹配传入的HTTP请求并将这些请求发送到应用中可执行的终结点的机制,ASP.NET Core中的路由系统是基于中间件实现的,主要通过UseRoutingUseEndpoints两个中间件来配置。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请求,并根据路由模板匹配相应的终结点。

如何利用ASP.NET Routing实现灵活的URL路由配置?

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]等属性来定义操作方法级别的路由规则。

如何利用ASP.NET Routing实现灵活的URL路由配置?

[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路由”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!