2012-04-05 85 views
1

我有一個字典對象,我想加密,然後把它放在查詢字符串中,然後在另一邊解密它。通過加密的查詢字符串傳遞字典

我爲此使用JavaScriptSerializer。現在我已經在同一頁onload上試了這個,並且它工作。所以我使用的加密/解密擴展方法正在工作。這導致我相信查詢字符串有一些問題。

例如

 var js = new JavaScriptSerializer(); 
     var d = new Dictionary<string, string>(); 
     d.Add("ID", "123456"); 
     d.Add("Name", "HELLO TEST"); 
     d.Add("Email", "[email protected]"); 
     var s = js.Serialize(d).EncryptString(); 
     var ds = js.Deserialize<Dictionary<string, string>>(s.DecryptString()); 
     @ViewBag.Test = ds["Name"]; 

在上述例子中,EncryptString()DecryptString()是擴展方法我使用。這按預期工作,所以它爲"Name"提供正確的值。

當我將序列化的加密字符串放入查詢字符串然後嘗試解碼它時遇到問題。

所以第一頁面上,我有這樣的事情:

 var js = new JavaScriptSerializer(); 
     var d = new Dictionary<string, string>(); 
     d.Add("ID", "123456"); 
     d.Add("Name", "HELLO TEST"); 
     d.Add("Email", "[email protected]"); 
     var s = HttpUtility.UrlEncode(js.Serialize(d).EncryptString()); 

s然後作爲查詢字符串。

接收頁,我有這個:

public ActionResult Display(string r) 
{ 
     var js = new JavaScriptSerializer(); 
     var decryptedString = HttpUtility.UrlDecode(r).DecryptString(); 
     var s = js.Deserialize<Dictionary<string, string>>(decryptedString); 
     return View(); 
} 

這將引發一個錯誤:​​在decryptstring行此錯誤。

我不明白這是怎麼回事......我URL編碼文本它進入查詢字符串之前,則urldecoding它它的反序列化之前..

編輯

想通了..我正在加密兩次......

回答

2

很可能你不需要UrlDecode你的字符串,因爲MVC在分配r參數的值之前已經做了。嘗試直接解密r

當然,我必須發出警告:你在這裏做什麼似乎是一個非常糟糕的主意。無論你想通過在URL中發送這個加密字典來完成任何事情,幾乎肯定有更好的方法來完成它。

+0

這沒有什麼區別。還是一樣的錯誤。 – jzm 2012-04-05 03:07:36

+0

@rudeovskiz​​ebear:你能告訴我們如何從這個's'值生成URL嗎? – StriplingWarrior 2012-04-05 03:10:30

+0

嗯,我試過字典,因爲我不知道還有什麼用。但是,我得到它的工作後,我得到一個錯誤說,字典序列化不受支持。我現在已將其轉換爲列表。你有什麼建議? – jzm 2012-04-05 03:35:14

1

很可能某些角色不會像您期望的那樣往返(即在這種情況下「+」往往會變成空格)。

使用Fiddler(或任何其他HTTP調試工具)檢查實際發送到/來自服務器的內容。比檢查是否給你帶來的字符串「顯示」行動 - cood機會,你看到什麼是錯的。