我有一个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:路径中的非法字符。”
经过大量谷歌搜索后,最好的建议似乎是确保网址不包含任何此类字符。不幸的是,在这种情况下,这是我无法控制的。
有办法解决这个问题吗?
答案 0 :(得分:8)
Scott Hanselman在allowing illegal characters in the path.
上发布了一个很好的总结如果您确实想要允许受限制的字符,请通过编辑web.config将其从列表中删除(这可能仅适用于.NET 4和IIS7):
<system.web>
<httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="<,>,*,%,:,&,\" />
</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”请求”。