ASP.NET MVC从请求参数中删除双正斜杠

时间:2014-03-03 16:52:37

标签: .net asp.net-mvc

在我的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 但在某种程度上,应用程序会自动将单斜杠替换为双斜杠。

enter image description here

这发生在哪里?有没有办法阻止这种行为?感谢。

2 个答案:

答案 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="&lt;,&gt;" />
</system.web>