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

3

我的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"});

这些URL看起来像:

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

它们都可以很好地工作...

我认为这2种方法完全一样。它们之间有什么区别?是MVC引擎为我执行了更多的操作,还是我在URL编码方面遗漏了什么。


你的激活操作是什么样子的?日志中是否有任何异常信息可以提供有关底层错误的更多信息? - chris
1个回答

4
尝试使用UrlPathEncode代替UrlEncode - 在路径中有些字符是非法的,但在查询字符串中是合法的。
话说回来 - 我相信判断字符是否“不良”是在路径解码之后由IIS执行的。 它将拒绝某些字符,因为URL可能映射到物理文件系统,因此用户可以访问他们真正不应该访问的东西。同样,它是为了防止请求发送真正不应该发送的数据。
通常,如果没有将参数映射为路由参数的操作效益,则不要过于努力进行映射 - 特别是在这种情况下,其中字符串可以是任何内容。
顺便说一句 - 如果那是二进制数据的编码; 您可以考虑使用十六进制编码或者改用修改的基于64位的URL,这样即使将其映射为路由参数也不会导致错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接