asp.net core 控制器操作路由使用编码斜杠来确定路由(仅限 IIS)

2024-01-12

我有一个 asp.net core 2.2 mvc 操作方法和GET来自客户端 JavaScript 代码:

[Route("/search/{searchterm}")]
public IActionResult Search(string searchterm)
{
    // code
}

现在,当我使用搜索字符串导航进行搜索时abc/def浏览器中的uri是/search/abc%2Fdef因为 / 被编码

I get a 404不过,因为路由属性解码了斜线并且说/search/abc/def与我的路线不符。 我想要的是治疗%2F作为正常的内容,因此搜索字符串是abc/def在我的操作方法里面。

有趣的是,这不会发生在我从 VS2017 运行的本地计算机上(我猜它运行 Kestrel),而只会发生在它在 IIS 上运行的测试服务器上。

这是IIS的事情吗?或者负载均衡器可能正在做某事?


您可以使用星号来表示searchterm可以包含斜杠。这被称为包罗万象的参数 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-3.1#route-template-reference,看起来像这样:

[Route("/search/{**searchterm}")]
public IActionResult Search(string searchterm)
{
    // code
}

从文档中:

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

当路由用于生成 URL 时,catch-all 参数会转义适当的字符,包括路径分隔符 (/) 字符。例如,路线foo/{*path}带有路由值{ path = "my/path" }产生foo/my%2Fpath。请注意转义的正斜杠。要往返路径分隔符,请使用**路由参数前缀。路线foo/{**path} with { path = "my/path" }产生foo/my/path.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asp.net core 控制器操作路由使用编码斜杠来确定路由(仅限 IIS) 的相关文章

随机推荐