为什么 %2b 会中断 asp.net MVC 路由?



抱歉,如果之前有人问过这个问题,但我找不到这个问题的解决方案。

我的路线定义为a/{param1}/{param2}/{param3}/{param4}/{param5}

当参数只是单词时,一切都可以工作,但是当任何参数看起来像someword%2bsomeotherword时,一切都会中断并且路线不匹配。 如果我删除 %2b,则路由已解析。

这是注册的第一条路线,所以我认为它不会先找到更好的路线。

抱歉,如果在某处回答了这个问题,但是我已经浏览了一堆SO答案和其他链接。MVC 中的路线一直躲避着我。

感谢您的任何帮助。

这里的问题是 IIS,而不是解决方案本身/代码。

选项 1 :

搞乱配置以绕过请求验证/允许双重转义 (Asp.Net) 您需要注意此处描述的某些风险/漏洞: https://stackoverflow.com/a/53621095/4798459

Asp.net :

直接在解决方案中使用 web.config 添加以下内容: 信用:https://stackoverflow.com/a/6026291/4798459

<system.web>
<httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" />
<pages validateRequest="false" />
</system.web>

.netcore :

由于此问题与 IIS 相关,而不是您的解决方案。您需要处理 web.config

  1. 在项目的根目录上创建新的 web.config。
  2. 右键单击,属性,将"复制到输出目录"设置为"始终复制">
  3. 发布 .net 核心应用时,将创建一个"基本 web.config"文件。(对于 IIS)
    • 您需要复制"基本 web.config"的内容。
    • 您可以找到自动生成的 web.config 文件:
    • 应用已发布的位置(本地服务器?
    • 您还可以将 api 临时发布到电脑上的随机路径,请参阅此处的详细信息 https://docs.devexpress.com/OfficeFileAPI/401445/dotnet-core-support/publish-net-core-application)

web.config 应该是这样的,我添加了带有注释的标签

<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<!-- XML node <security> is added to allow allowDoubleEscaping and add support for + paremeter in a route. Risk:https://stackoverflow.com/a/53621095/4798459 -->
<security>
<requestFiltering allowDoubleEscaping="true"></requestFiltering>
</security>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments="[.SolutionName.Namespace.dll]" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
  1. 请确保在发布应用之前完成步骤 2,否则它将无法正常工作。
  2. 未通过 iisexpress 测试

选项 2

在 API 中更改普拉马特类型。由于在路由上,请改用查询字符串

选项 3

请求过滤/路由的自定义解决方案,我没有任何示例,似乎有点"过分"。

选项 4,以避免:

使用其他解决方案进行编码/解码特殊雕刻器(我没有尝试过) https://stackoverflow.com/a/55637235/4798459

最新更新