【问题标题】:URL Parameter encoding in MVC .NETMVC .NET 中的 URL 参数编码
【发布时间】:2014-11-28 14:35:25
【问题描述】:

我在 MVC 4 .NET 应用程序中有一个控制器,它从 URL 接收字符串作为参数。这来自重定向到 Route.config 中的控制器的 aspx 页面。

如果我在客户端发送这个参数的值:fwdgerhb+bhrth+ftrgbhrt

我在服务器上得到以下值:fwdgerhb bhrth ftrgbhrt

服务器将 URL 参数值解释为编码的 URL,并将 + 替换为 。但它没有经过 URL 编码。如果特殊字符的其他组合出现在参数值中,也会出现这种情况。

在 IIS 服务器中是否有配置参数来配置服务器不尝试对该值进行 URL 解码?

示例请求:

mypage.aspx?value=cat+dog    (NOT ENCODED)

路由配置

static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRouteLowercase(
        name: "MyRouter",
        url: "mypage.aspx",
        defaults: new { controller = "My", action = "DoLog" }
    );
}

控制器:

public class MyController : Controller
{
    [AllowAnonymous]
    public ActionResult DoLog(string value)
    {
        //Here value has "cat dog"
    }
}

【问题讨论】:

  • 您的控制器是用 VB.Net 还是 C# 编写的?可以发一下代码吗?
  • 是 C#。我贴出来了,不过我觉得没关系,不是代码问题,我要发送参数不编码,所以我只需要如何让服务器知道URL来不编码。
  • 您的要求是什么?是否要取回编码的参数,例如:fwdgerhb+bhrth+ftrgbhr 在这种情况下,您为什么不自己UrlEncode 呢?
  • 因为我已经分发了旧代码而没有编码这个值,并且控制器必须与之兼容
  • @Dani 那么,假设这是您想要做的(您还没有澄清),当它碰到控制器时,是什么阻止您对其进行编码?

标签: c# url iis parameters url-encoding


【解决方案1】:

您可以使用以下方法从控制器中手动获取查询字符串:

Request.QueryString.Get("value");

或者,从视图中获取它:

Html.ViewContext.HttpContext.Request.QueryString.Get("value");

但老实说,为什么不在通过路由发送字符串之前自己对字符串进行编码:

HttpUtility.UrlEncode(value);

然后当你再次获得值时:

HttpUtility.UrlDecode(value);

这样你就可以控制你的字符串了


更新

您还可以执行以下操作以允许您的 routeConfig 允许“+”属性:

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

这里有一个问题告诉你开启和关闭这个功能的起起落落:Is Enabling Double Escaping Dangerous?

【讨论】:

  • 因为我已经分发了旧的客户端代码而没有编码这个值,并且控制器必须与之兼容。打算试试你的解决方案。
  • 不,我也得到“+”号作为空格
  • 您的字符串在放入 URL 之前仍未被编码。当我尝试使用 HttpUtility.UrlEncode("1+2"); 发送字符串 1+2 时,我得到 1%252b2 然后又变成 1+2 时我做HttpUtility.UrlDecode("1%252b2");。有没有办法修改传入的值?
  • 不只是“+”,是任意字符,值为加密字符串
【解决方案2】:

是的,MVC 会自动对操作参数进行 URL 解码,但您仍然可以通过查询字符串访问 URL 编码版本。正如您在这个问题中看到的那样:Is MVC2 ASP.Net URLDecoding automatically?

您也可以尝试访问名为 UNENCODED_URL 的服务器变量。可以在此处找到有关此方案的更多信息:URL Rewrite Module Configuration Reference

【讨论】:

  • 有一个配置参数可以避免这种行为,或者我必须在控制器中再次对其进行 URL 编码以获得正确的值?
  • 我不知道是否存在任何配置参数来避免这种情况。你还可以使用 var unicornName = requestQuery["value"];需要再次对其进行 urlEncode
  • 我现在尝试在服务器上对其进行 URL 编码,但完成的编码与 MVC 框架完成的 URL 解码不同。例如。如果我收到字符串“/”,当 MVC 对其进行解码时,它仍为“/”,但再次对其进行 URL 编码,我得到“%2f”,所以它无效......
  • 你可能不需要这个但是.....你也可以尝试访问一个名为 UNENCODED_URL 的服务器变量。可以在此处找到有关此方案的更多信息:iis.net/learn/extensions/url-rewrite-module/…
  • 是的,读取 UNENCODED_URL 我可以得到正确的值,非常感谢
猜你喜欢
  • 2011-08-19
  • 1970-01-01
  • 2012-02-06
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多