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



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

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

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

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

则表达式通过:regex()参数得到支持。有关信息,请参阅有关正则表达式 ASP.NET 核心中的路由文档,以及例如路由中间件。

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

一种替代方法是在路由中使用 catch-all(在 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();
}

我认为另一种方法是在中间件中编写一些额外的路由代码。

最新更新