【问题标题】:Infinite path route into an ASP.NET Core action无限路径路由到 ASP.NET Core 操作
【发布时间】:2019-04-24 16:41:03
【问题描述】:

我想创建一个路由,在 url 中路由无限的字符串集合。

像这样:

https://github.com/{orgName}/{projectName}/blob/{branchName}/{folderName1}/{folderName2}/.../{folderNameN}/{fileName}

例如

https://github.com/AiursoftWeb/Nexus/blob/master/Account/Controllers/AccountController.cs

将被路由到此操作。路由结果应为:

orgName: AiursoftWeb
projectName: Nexus
branchName: master
folderNames: string[2] of:
    "Account"
    "Controllers"
fileName: AccountController.cs

我如何做到这一点?

我尝试了以下方法:

[Route("Folders/ViewContent/{siteName}/{folderNames}")]
public async Task<IActionResult> ViewContent(string siteName, params string[] folderNames)
{
    throw new NotImplementedException();
}

但它不起作用。

【问题讨论】:

  • 你只是想返回静态文件吗?因为只使用 StaticFilesMiddleware 会容易得多。
  • @Valuator 不。我正在创建一个 API。

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


【解决方案1】:

使用星号字符将路由模板中的占位符表示为包罗万象的参数。然后,您必须自己将此参数拆分为文件夹名称:

[Route("Folders/ViewContent/{siteName}/{*folderNames}")]
public async Task<IActionResult> ViewContent(string siteName, string folderNames)
{
    folderNames = folderNames ?? "";
    string[] folders = folderNames.Split('/', StringSplitOptions.RemoveEmptyEntries);

     // your other code
}

从 ASP.net Core 2.2 开始,您应该使用双星号,以便自动生成的 url 不会对 url 中的斜杠进行 url 转义:

[Route("Folders/ViewContent/{siteName}/{**folderNames}")]

来自https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.2

您可以使用星号 (*) 或双星号 (**) 作为前缀 路由参数绑定到 URI 的其余部分。这些被称为 包罗万象参数。例如,blog/{**slug} 匹配任何 URI 以/blog 开头,后面有任何值,分配给 slug 路由值。包罗万象的参数也可以匹配空 字符串。

catch-all 参数在 route 用于生成 URL,包括路径分隔符(/) 人物。例如,路由值{ 的路由foo/{*path} path = "my/path" } 生成 foo/my%2Fpath。注意转义前 削减。要往返路径分隔符,请使用 ** 路由 参数前缀。路线foo/{**path}{ path = "my/path" } 生成foo/my/path

【讨论】:

    【解决方案2】:

    您在路由中使用了 2 个约束,这会导致 URL 完全匹配。您确定您的网址以“文件夹/ViewContent/”开头。根据您的问题,您的 URL 中有 6 个文件夹名称,但您的路由仅处理 4 个更深的文件夹。通过传递更多文件夹名称(或文件夹的占位符)来编写路由以匹配该文件夹。

    为了更好地调试,您可以将整个 url 作为静态传递并一一更改以更好地调试您的路由。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多