【问题标题】:asp.net core controller action route uses encoded slash to determine route (IIS only)asp.net 核心控制器动作路由使用编码斜线来确定路由(仅限 IIS)
【发布时间】:2020-04-09 00:34:37
【问题描述】:

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

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

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

我得到了一个404,因为路由属性解码了斜线并且说/search/abc/def 与我的路由不匹配。 我想要的是将%2F 视为正常的内容,因此在我的操作方法中搜索字符串是abc/def

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

这是 IIS 的事情吗?或者负载均衡器正在做什么?

【问题讨论】:

    标签: asp.net-core iis kestrel


    【解决方案1】:

    您可以使用星号表示searchterm 可以包含斜杠。这称为catch-all parameter,如下所示:

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

    来自文档:

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

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

    【讨论】:

    • 谢谢,成功了!知道为什么 IIS 与本地开发服务器有不同的行为吗?
    • @Métoule 有没有办法做到这一点? [Route("/search/{**searchterm}/{**additionalSearch}")]
    • @BradenBrown 不可能有两个 catch-all 参数,因为无法知道一个在哪里停止,另一个在哪里开始(例如/search/one/two/three/four)。您可以改用查询参数(例如/search?searchterm=one/two/three&additionalSearch=four)。
    • @Métoule 这就是我的想法。这是真的,出于某种原因,我没有考虑使用查询参数......谢谢! +1
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2019-08-02
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多