📜  net core 2.1 路由约束 (1)

📅  最后修改于: 2023-12-03 15:33:05.996000             🧑  作者: Mango

Net Core 2.1 路由约束

在 Net Core 2.1 中,路由约束 (route constraints) 可以帮助我们限制 URL 中使用的参数的格式,从而提高应用程序的安全性和可靠性。

在本文中,我们将介绍 Net Core 2.1 中,如何使用路由约束。

常用的路由约束

以下是 Net Core 2.1 中常用的路由约束:

  • minlength: 最小长度
  • maxlength: 最大长度
  • length: 精确长度
  • int: 整数
  • long: 长整数
  • float: 单精度浮点数
  • double: 双精度浮点数
  • decimal: 十进制数
  • bool: 布尔值
  • datetime: 日期时间
  • guid: GUID
使用路由约束

一般情况下,路由约束是在控制器的方法参数中使用。以下是一个例子:

[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    [HttpGet("{id:int}")]
    public IActionResult Get(int id)
    {
        // ...
    }
}

在上面的例子中,我们指定了路由约束 {id:int},表示必须是一个整数。这样,就可以防止一些恶意用户输入非法数据。

我们也可以使用 [FromQuery] 属性来指定约束条件,例如:

[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    [HttpGet]
    public IActionResult Get([FromQuery(Name = "age")] int? age)
    {
        // ...
    }
}

在上面的例子中,我们指定了参数 age 必须是一个整数。如果用户传递的不是整数,就会返回错误信息。

自定义路由约束

如果没有找到符合要求的路由约束,我们也可以自定义路由约束。

以下是一个自定义的路由约束,用于限制参数必须是小于等于指定日期:

public class MaxDateAttribute : RouteConstraintAttribute
{
    private readonly DateTime maxDate;

    public MaxDateAttribute(string maxDate)
    {
        this.maxDate = DateTime.Parse(maxDate);
    }

    public override bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
    {
        DateTime date;
        if (DateTime.TryParse(values[routeKey].ToString(), out date))
        {
            return date <= maxDate;
        }
        return false;
    }
}

在上面的例子中,我们定义一个 MaxDateAttribute 路由约束,用于限制参数必须小于等于指定日期。

以下是如何使用自定义路由约束的例子:

[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    [HttpGet("{date:MaxDate(2021-12-31)}")]
    public IActionResult Get(DateTime date)
    {
        // ...
    }
}

在上面的例子中,我们使用了自定义路由约束 MaxDate,限制参数必须小于等于 2021-12-31。

结论

路由约束是 Net Core 2.1 中提高应用程序安全性和可靠性的一个重要特性。我们在控制器的方法参数中进行约束,可以有效的防止恶意用户输入非法数据。同时,我们也可以自定义路由约束,提高应用程序的灵活性和可读性。