如何使用正则表达式匹配路由部分中的url部分? WebAPI .NET Core 2.2

时间:2019-04-22 06:03:38

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

我现在正在尝试编写WebApi应用程序。在路由部分(控制器)中,我想使用正则表达式来匹配url的一部分。但是,似乎"/"无法被很好地识别。

例如,API网址为"api/books/science/list"。我想获取"api/books/science""list"。我尝试了以下正则表达式[HttpGet("{url=.*}/list")]。但是似乎正则表达式不起作用。 ".*""\"不匹配。

api的设计类似于"api/*{path}/list"。对于*{path},它可能具有多个结构,例如books/sciencebooks/art/Asia'。我想使用正则表达式来匹配它们,然后将它们用于以下操作。

实际上,我尝试了另一种方法来获取URL [HttpGet("{**url}")]。但是我想这不是一个很好的解决方案,因为那时候我需要解析网址。

1 个答案:

答案 0 :(得分:0)

正则表达式通过:regex()参数得到支持。有关信息,请参阅Regex上的ASP.NET Core文档中的路由,例如,请参见Routing Middleware

尝试:[HttpGet("{url:regex(.*)}/list")] 正如您所指出的那样,这是行不通的,因为它适用于路由网址的标记化值。

一种选择是在路由中使用包罗万象(在Startup.cs中):

routes.MapRoute(
    name: "therest",
    template: "/{**url}",
    defaults: new { controller = "Home", action="Index"} // Send to /home/index
);

或者,如果您知道路径元素的数量有限,则可以将它们全部包含在内:

[HttpGet("/{url1}")]
[HttpGet("/{url1}/{url2}")]
[HttpGet("/{url1}/{url2}/{url3}")]
[HttpGet("/{url1}/{url2}/{url3}/{url4}")]
public IActionResult Test(string url1 = null, string url2 = null, string url3 = null, string url4 = null)
{
    var url = string.Join("/", url1, url2, url3, url4);
    //... return View();
}

我相信替代方法是在中间件中编写一些其他路由代码。