使用ASP.NET MVC处理的URL编码参数

时间:2012-01-09 15:53:11

标签: asp.net-mvc asp.net-mvc-3 urlencode

我的MVC Web应用程序生成一个激活链接,可以包含任何字符(%,+,/等)。我对字符串进行URL编码并生成链接:

new UrlHelper(HttpContext.Current.Request.RequestContext)
       .RouteUrl("AccountActivation", 
                 new { id = HttpContext.Current.Server.UrlEncode(activationString) };

然后添加域,它看起来像:

 http://localhost/AccountActivation/asdlkj223%25asd%2Basw3fgasdme

然后将URL传递给用户。

这种情况下的路线是:

 routes.MapRoute(
            "ActivateAccount",
            "AccountActivation/{id}",
            new { controller = "Account", action = "Activate", id = ""});     

对我来说似乎很好,但是ASP.NET开发服务器和IIS给了我HTTP错误400 - 错误的请求。这意味着我无法看到URL的问题。

当摆脱路线描述中的{id}时(我也试过{* id}但没有成功):

  routes.MapRoute(
            "ActivateAccount",
            "AccountActivation",
            new { controller = "Account", action = "Activate"});

网址如下:

http://AccountActivation?id=asdlkj223%25asd%2Basw3fgasdme

他们工作得很好......

我虽然这两种方法完全相同。他们之间有什么区别?是MVC引擎为我执行更多操作还是遗漏了URL编码。

1 个答案:

答案 0 :(得分:4)

尝试UrlPathEncode而不是UrlEncode - 某些字符在查询字符串中合法的路径中是非法的。

那就是说 - 我相信在路径解码发生之后执行对字符是否“坏”的分析;并由IIS完成。它会拒绝某些字符,因为URL可能会映射到物理文件系统,因此可以允许用户访问他们真正无法访问的内容。同样,这是为了防止请求发送真正不应发送的数据。

一般来说,如果将参数映射为路由参数在操作上没有任何好处,那么不要太费力地映射它 - 特别是在这种情况下,字符串可以是任何东西。

顺便说一下 - 如果那是二进制数据的编码;您可以考虑使用十六进制编码或使用modified base-64 for URLs代替 - 如果映射为路由参数,则不会导致错误。

相关问题