asp.net-mvc - 使用 ASP.NET MVC 处理 URL 编码参数

标签 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 编码的某些内容。

最佳答案

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

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

通常,如果将参数映射为路由参数在操作上没有任何好处,那么就不要太努力地映射它 - 特别是在字符串可以是任何内容的情况下。

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

关于asp.net-mvc - 使用 ASP.NET MVC 处理 URL 编码参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791167/

相关文章:

asp.net-mvc-3 - 在 MVC 3 中为局部 View 着色

c# - ASP.NET MVC3 ViewModel - 困惑

c# - 强类型分部 View

javascript - 页面重新加载后维护菜单的最佳实践是什么?我有这个自定义代码,感觉不对

javascript - 转义并在邮件客户端中显示(mailto 链接)

PHP XML 编码正则表达式

c# - C#中特殊字符的Url编码方法

asp.net-mvc - 如何在 ASP.NET MVC 中构建没有 ViewContext 的路由?

asp.net-mvc - Kendo UI Treeview 绑定(bind)

asp.net-mvc - ASP.NET MVC 3 Beta 1阻止对Razor View 的访问