在我的ASP.NET MVC 4应用程序中,我在控制器上有一个操作,它将URL字符串作为参数:
public ActionResult Get(string url)
{
var hash = TextUtil.GenerateShortStringHash(url);
...
return Content(html, "text/html");
}
请求如下所示:http://localhost:37779/api/get/http:%2F%2Fwww.mysite.com
但在某种程度上,应用程序会自动将单斜杠替换为双斜杠。
这发生在哪里?有没有办法阻止这种行为?感谢。
答案 0 :(得分:3)
我怀疑是因为它是URL的层次结构部分的一部分,它会自动将双斜杠转换为单斜杠,因为URL的那部分不允许使用双斜杠。由于URL包含URL的层次结构部分中不允许的字符,因此最好将其指定(适当编码)作为查询字符串的一部分(如果是GET请求)或表单参数(用于POST)。 / p>
http://localhost:37779/api/get/?url=http:%2F%2Fwww.mysite.com
答案 1 :(得分:1)
我完全同意@tvanfosson这样的特殊字符应作为查询字符串参数传递,而不是使用url的路径部分。 Scott Hanselman写了一篇很好的blog post
来解释如果你试图传递这些角色你将面临的挑战。
这就是说,你可以使用双重编码使其工作:
http://localhost:37779/api/get/http%253A%252F%252Fwww.mysite.com
并在您的控制器操作中:
public ActionResult Get(string url)
{
var hash = TextUtil.GenerateShortStringHash(HttpUtility.UrlDecode(url));
...
return Content(html, "text/html");
}
为了使其正常工作,您需要将以下内容添加到web.config以启用双重编码:
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
并明确定义无效字符,以便:
和/
不属于他们,否则您将获得400 Bad Request:
<system.web>
<httpRuntime requestPathInvalidCharacters="<,>" />
</system.web>