c# - 如何在asp.net核心的路由属性中设置正则表达式的匹配超时
问题描述
MSDN 建议在所有正则表达式模式匹配操作中设置一个超时值。
我们如何在asp.net核心项目的路由属性中设置匹配超时
[Route("[controller]/[action]/{test:regex(^(\\w+$)}")]
public string Get(string test)
{
//...
}
解决方案
您可以参考以下示例创建自定义路由约束,然后设置超时。
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();
}
然后,无需在自定义路由约束中设置超时,请查看此屏幕截图:
推荐阅读
- mysql - 每门课程的最后留言
- winapi - 如何从 Win32 中的 NM_CUSTOMDRAW 消息中提取颜色?
- bash - 创建 Bash 脚本以提供登录用户(谁)的终端输出
- google-cloud-platform - Cloud Run 获取公共 URL
- r - 从 R 中运行终端命令:显示 SCP 传输的输出
- javascript - 如何避免在父组件状态更新时重新渲染循环中的所有子组件
- x86 - 当预取队列中只剩下 1 个字节时,8086 是否会启动 1 个字节的代码提取?
- heroku - Heroku Pipelines:来自 app.json 的配置被忽略
- serial-port - 树莓派-4;pl2303_read_int_callback - usb_submit_urb 失败,结果为 -1
- css - 无限流文字动画CSS