2011-08-29 103 views
6

我有以下路由代码:.NET MVC路由W/url编码问题

routes.MapRoute(
      "email-validated/{sessionId}", 
      "email-validated/{sessionId}", 
      new { controller = "User", action = "EmailValidated", sessionId = UrlParameter.Optional } 
      ); 

当我打W精品路线/东西是URL编码它不会匹配%2F的路线,% 2b和其他一些转义字符。它也不会匹配编码的非URL(事W/+等),例如

这工作:

电子邮件验证/ XQiKC6KMM%2cmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

这不起作用(containts%2F等):

email-validated/XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 

这不起作用(包含+等)

email-validated/XQiKC6KMM+mko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 
+0

你是如何产生这个SessionID的? – hunter

+0

您应该使用GUID而不是该字符串。它看起来非常随机,并且有机会不仅包含严重编码的字符,而且还包含使请求无效的字符。 –

+0

该会话是一个随机字符串,然后是64位编码,然后是HttpUtilty.UrlEncoded。我正在将遗留站点移植到mvc 3,并且重新编码会话ID如何工作不幸,因此需要针对此解决方案: –

回答

3

它看起来像路由路径奇怪地处理逃脱/的和+的。尝试将它作为查询字符串参数传递。

让您的端点:

routes.MapRoute(
      "email-validated", 
      "email-validated", 
      new { controller = "User", action = "EmailValidated" } 
      ); 

与像的请求调用它:

email-validated/?sessionId=XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 

然后从改变你的功能

EmailValidatedFunction(string sessionId) 
{ 
    //...do stuff with sessionId here 
} 

到:

EmailValidatedFunction() 
{ 
    string sessionId = Request["sessionId"]; 
    //...do stuff with sessionId here 
} 
6

如果可以,您需要使sessionId URL安全。 sessionId是Base64编码的,在Base64中有三个URL问题字符,“/”,“+”和“=”。使用下面的创建链接时编码您的sessionId:

public string ToUrlSafeBase64String(string Base64String) 
    { 
     // avoid any slashes, plus signs or equal signs 
     // the following makes this base64 string url safe 
     Base64String = Base64String.Replace("/", "_"); 
     Base64String = Base64String.Replace("+", "-"); 
     return Base64String.Replace("=", String.Empty); 
    } 

然后,使用以下方法来重新创建原始Base64编码字符串:

public string FromUrlSafeBase64String(string Base64String) 
    { 
     // add back any slashes, plus signs or equal signs 
     // the following makes this url safe string a base64 string 
     Base64String = Base64String.Replace("_", "/"); 
     Base64String = Base64String.Replace("-", "+"); 
     return Base64String.PadRight(Base64String.Length + (4 - Base64String.Length % 4) % 4, '='); 
    } 
+1

我认为这是两个更好的解决方案。 – YesMan85

+0

其他答案就像说你的汽车发出奇怪的声音,让它停下来,停止驾驶它,这个人说打开发动机罩并修理X.谢谢,正是我需要的! – Mortana

0

这里是我发现,使解决方案url编码的字符,如Asp.Net MVC网址中的正斜杠%2f

以下内容添加到您的Global.asax文件的Application_BeginRequest方法:

var realUrl = Request.ServerVariables["HTTP_URL"]; 
Context.RewritePath(realUrl); 

由于出现这种情况MVC路由之前,你就可以做你原本想做的事。

请记住,您需要手动解码Action Methods中的参数以获取它们的实际值(因为我们阻止框架这样做)。