首页 > 解决方案 > 如何在asp.net核心的路由属性中设置正则表达式的匹配超时

问题描述

MSDN 建议在所有正则表达式模式匹配操作中设置一个超时值。
我们如何在asp.net核心项目的路由属性中设置匹配超时

[Route("[controller]/[action]/{test:regex(^(\\w+$)}")]
public string Get(string test)
{
    //...
}

标签: c#asp.net-mvcasp.net-core.net-coreddos

解决方案


您可以参考以下示例创建自定义路由约束,然后设置超时。

Public class MyCustomConstraint : IRouteConstraint
{
    private Regex _regex;

    public MyCustomConstraint()
    {
        _regex = new Regex(@"^[1-9]*$",
                            RegexOptions.CultureInvariant | RegexOptions.IgnoreCase,
                            TimeSpan.FromMilliseconds(100));
    }
    public bool Match(HttpContext httpContext, IRouter route, string routeKey,
                      RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (values.TryGetValue(routeKey, out object value))
        {
            var parameterValueString = Convert.ToString(value,
                                                        CultureInfo.InvariantCulture);
            if (parameterValueString == null)
            {
                return false;
            }

            return _regex.IsMatch(parameterValueString);
        }

        return false;
    }
}

然后,在 Startup.ConfigureServices 方法中注册上述约束:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddRouting(options =>
    {
        options.ConstraintMap.Add("customName", typeof(MyCustomConstraint));
    });
}

然后,在 action 方法中应用约束,如下所示:

// GET /api/test/my/3
[HttpGet("my/{id:customName}")]
public IActionResult Get(int id)
{
    return ControllerContext.MyDisplayRouteInfo(id);
}

调试截图如下:

在此处输入图像描述

此外,您还可以通过调用AppDomain.SetData 方法来设置应用程序域中所有 Regex 匹配操作的超时值,Program.cs 文件中的代码:

    public static void Main(string[] args)
    {
        AppDomain domain = AppDomain.CurrentDomain;
        // Set a timeout interval of 200 milliseconds.
        domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromMilliseconds(200));

        CreateHostBuilder(args).Build().Run();
    }

然后,无需在自定义路由约束中设置超时,请查看此屏幕截图:

在此处输入图像描述


推荐阅读