【问题标题】:Howto allow "Illegal characters in path"?如何允许“路径中的非法字符”?
【发布时间】:2011-01-06 10:22:42
【问题描述】:

我有一个 MVC.NET 应用程序,其中一条路由如下:

routes.MapRoute("member", "member/{id}/{*name}", new { controller = "member", action = "Details", id = "" }, new { id = @"\d+" });

因此,链接可能是这样的:http://domain/member/123/any_kind_of_username

这通常可以正常工作,但如果路径包含非法字符(例如双引号:http://domain/member/123/my_"user"_name),我会收到“System.ArgumentException:路径中的非法字符。”

经过大量谷歌搜索后,最好的建议似乎是确保网址不包含任何此类字符。不幸的是,在这种情况下,这是我无法控制的。

有没有办法解决这个问题?

【问题讨论】:

  • 想必它们被称为非法字符,因为你不能使用它们......
  • @Mitch - 例如,双引号对 Apache 来说效果很好,所以我不明白为什么 IIS 不允许它。 @Oded - 问题是我无法控制这些网址。

标签: asp.net-mvc routing


【解决方案1】:

您应该在提交之前在客户端对 URL 进行 URL 编码。尝试使用 UrlHelper.Encode 方法。

【讨论】:

  • 抱歉,这里的内容与迄今为止的其他建议相同。恐怕我无法控制客户端的网址。
  • 即使从客户端发送了编码的 URI,我也得到了这个
  • "建议似乎是为了确保 url 不包含任何此类字符。不幸的是,在这种情况下,这是我无法控制的。"
【解决方案2】:

事实证明,您可以通过在 web.Config 中为 requestFiltering 设置 allowDoubleEscaping="false" 来避免这种情况。 即:

<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="false" />
    </security>
  </system.webServer>
</configuration>

也许不是完美的解决方案(非常感谢任何更好的解决方案),但它解决了问题。

【讨论】:

【解决方案3】:

网址中的与号 (&) 怎么样?例如:mysite.com/JellyBeans/PB&J,其中“PB&J”是控制器动作方法中的参数值。您如何绕过 MVC 和 ASP.NET 引擎将其视为基本 url 字符串中的非法字符?用 %26 编码似乎不起作用。奇怪的是,在启动 VS 调试时本地 Web 服务器(VS 内置 Web 服务器)可以很好地处理这种情况(作为 & 和 %26),但是当部署到运行 IIS7 的 Web 服务器时,URL 会导致“错误请求”。

【讨论】:

  • VS.NET 内置的网络服务器有很多缺陷并且不符合标准。如果你遇到任何奇怪的行为,你最好忽略它而只使用 IIS。
  • 这是一个后续问题,最好作为新问题发布,如果在此处链接,请在评论中链接,而不是答案。在这种情况下,它可能已经被问过了,所以最好找到现有的问题而不是再次问。
【解决方案4】:

Scott Hanselman 在allowing illegal characters in the path. 上发布了一个很好的总结

如果您真的想允许受限制的字符,请通过编辑您的 web.config 将它们从列表中删除(这可能仅适用于 .NET 4 和 IIS7):

<system.web>
    <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" />
</system.web>

你可能还需要做hbruce suggests:

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

仍然有一些特定的路径不起作用,(例如 /search/% ),因为您将收到 400 “Bad Request - Invalid URL”消息。我发现的唯一解决方法是将该部分用作查询字符串:/search?q=% 与上述步骤。

【讨论】:

  • .net 2 有替代方案吗?
猜你喜欢
  • 2019-08-30
  • 1970-01-01
  • 2011-01-27
  • 2012-03-05
  • 2018-02-28
  • 2015-07-31
  • 2014-03-22
相关资源
最近更新 更多