asp.net核心控制器操作路由使用编码的斜杠确定路由(仅IIS)

时间:2019-12-16 14:16:05

标签: asp.net-core iis kestrel

我有一个asp.net核心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吗?还是负载均衡器正在做某事?

1 个答案:

答案 0 :(得分:3)

您可以使用星号表示searchterm可以包含斜杠。这称为catch-all parameter,看起来像这样:

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

从文档中:

  

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

     

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