2011-08-29 102 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中的參數以獲取它們的實際值(因爲我們阻止框架這樣做)。