我的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编码。
答案 0 :(得分:4)
尝试UrlPathEncode
而不是UrlEncode
- 某些字符在查询字符串中合法的路径中是非法的。
那就是说 - 我相信在路径解码发生之后执行对字符是否“坏”的分析;并由IIS完成。它会拒绝某些字符,因为URL可能会映射到物理文件系统,因此可以允许用户访问他们真正无法访问的内容。同样,这是为了防止请求发送真正不应发送的数据。
一般来说,如果将参数映射为路由参数在操作上没有任何好处,那么不要太费力地映射它 - 特别是在这种情况下,字符串可以是任何东西。
顺便说一下 - 如果那是二进制数据的编码;您可以考虑使用十六进制编码或使用modified base-64 for URLs代替 - 如果映射为路由参数,则不会导致错误。