使用正则表达式捕获所有端点

时间:2019-12-16 19:52:54

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

我希望捕获所有与特定格式(即<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script> <div id="root"></div>匹配)匹配的请求,以路由到我的.NET Core 3.0应用程序中的单个端点。

例如,我正在寻找与以下格式匹配的URL:

regex

https://localhost:5001/test/status/1234567899999/test/的ID可以是任意程度的字符,因此可以是正则表达式。

The regex works fine, as seen here.

I've taken a look at this question并写了以下内容:

int

捕获的每个 请求,无论是否匹配正则表达式。

我还尝试过在 app.MapWhen(context => Regex.IsMatch(context.Request.Path, @"/([a-zA-Z0-9_]+)/status/\d+"), test => test.UseMvc(routes => routes.MapRoute(name: "Tweet", template: "{controller=Home}/{action=Test}"))); 属性中进行模式匹配,例如:

Route

这没有捕获任何请求,但是我可以在调试控制台中看到这些请求已通过我的应用程序通过管道传递。他们只是从未达到过定义的端点。

请注意,双 [HttpGet, Route(@"{path:regex(/([[a-zA-Z0-9_]]+)/status/d+)}")] public IActionResult Test([FromRoute] string path) { string s = string.Empty; return Ok(s); } 用于按照.NET Core的指示在路由内部进行解析。

是否有更好的方法通过[[ ]]匹配模式并将请求重新路由到控制器端点?

1 个答案:

答案 0 :(得分:1)

您可以使用Custom Route Constraints

步骤1:通过实现IRouteConstraint创建路由约束。

public class RegexConstraint : IRouteConstraint
{
    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values,
        RouteDirection routeDirection)
    {
        return Regex.IsMatch(httpContext.Request.Path, "\\w+[-]{2}status[-]{2}\\d+");
    }
}

步骤2:注册您的约束Startup.cs-> ConfigureServices方法,如

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

第3步:使用您的自定义路线约束,如下所示

public class TestController : Controller
{
    [HttpGet("test/index/{path:regexRouter}")]
    public IActionResult Index([FromRoute] string path)
    {
        return Ok(path);
    }

    [HttpGet("test/get/{id:int}")]
    public IActionResult Get([FromRoute] int id)
    {
        return Ok(id);
    }
}

现在,如果您运行应用程序并输入

1-> https://localhost:5001/test/index/longinitial--status--122输出'longinitial--status--122'

2-> https://localhost:5001/test/get/123输出123

要构建路径,您只需在--动作中将/替换为Index

path = path.Replace("--", "/");

我希望这会有所帮助。