我有一個構建HTML電子郵件的應用程序。包含在內容中的是編碼的URL參數,例如可能包含促銷代碼或產品參考。該電子郵件由Windows服務(本質上是一個控制檯應用程序)生成,並且該鏈接在被點擊時由MVC網站處理。下面是用於創建電子郵件鏈接的代碼:無法解碼Base-64 URL
string CreateLink(string domain, string code) {
// code == "xyz123"
string encrypted = DES3Crypto.Encrypt(code); // H3uKbdyzrUo=
string urlParam = encrypted.EncodeBase64(); // SDN1S2JkeXpyVW890
return domain + "/" + urlParam;
}
的MVC控制器上的操作方法構造如下:
public ActionResult Index(string id) {
string decoded = id.DecodeBase64();
string decrypted = DES3Crypto.Decrypt(decoded);
...
}
在我們所有的測試,這一機制曾擔任預期,但是,現在我們已經走了,我們正在看到大約有4%的錯誤率,其中base-64的轉換失敗,但有以下例外:
輸入不是有效的Base-64字符串,因爲它包含非基本64性格,超過兩個填充字符ers或填充字符中的非空白字符。
來自url的id參數'看起來'確定。這個問題似乎與EncodeBase64/DecodeBase64方法失敗,因爲DecodeBase64方法在失敗時返回一個'亂碼'字符串,例如「 nl 」「」鏈接。
此外,大部分錯誤都來自IE6用戶代理,導致我認爲這是一個字符編碼問題,但我不明白爲什麼。
作爲參考,這裏是我的基-64的URL編碼的代碼:
public static string EncodeBase64(this string source)
{
byte[] bytes = Encoding.UTF8.GetBytes(source);
string encodedString = HttpServerUtility.UrlTokenEncode(bytes);
return encodedString;
}
public static string DecodeBase64(this string encodedString)
{
byte[] bytes = HttpServerUtility.UrlTokenDecode(encodedString);
string decodedString = Encoding.UTF8.GetString(bytes);
return decodedString;
}
任何建議,將不勝感激。
當你得到異常時,我會在你的控制器中記錄「id」值,看看你是否可以發現一個模式。我的猜測是,來到你身份證有一些無效字符或被截斷(可能是由用戶的郵件客戶端) – 2012-08-07 13:26:34
嗨Hector,我一直這樣做,但我看不出任何明顯的問題與字符串 - 這裏是一個失敗的字符串的例子「ywhar0xznxpjdnfnddc0yxzbk2jnqt090」。我注意到的一件事是,大多數用戶代理被報告爲IE6.0 - 但我不明白爲什麼應該如此。 – Neilski 2012-08-07 13:49:22
我想我可能找到了問題! IE6(或其關聯的電子郵件客戶端)似乎將url轉換爲小寫 - 使用base-64派生編碼進行編碼時,大小寫字符具有不同的含義,因此在網站上解碼時會出現問題。所以,我只需要找到一種只使用小寫字母數字字符來編碼url的方法!想法任何人? – Neilski 2012-08-07 16:39:39