如何允许“路径中的非法字符”?

时间:2010-01-18 15:51:34

标签: asp.net-mvc routing

我有一个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

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

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

有办法解决这个问题吗?

4 个答案:

答案 0 :(得分:8)

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 =%以及上述步骤。

答案 1 :(得分:4)

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

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

也许不是完美的解决方案(对于更好的解决方案的任何建议都非常感激),但它解决了这个问题。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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