如标题所示,我得到:
Base-64 char数组的长度无效。
我在这里已经阅读了有关此问题的信息,似乎建议是将ViewState如果较大则存储在SQL中。我正在使用具有大量数据收集功能的向导,因此我的ViewState很大。但是,在我转向“数据库存储”解决方案之前,也许有人可以看看并告诉我是否还有其他选择?
我使用以下方法构造要发送的电子邮件:
public void SendEmailAddressVerificationEmail(string userName, string to) { string msg = "Please click on the link below or paste it into a browser to verify your email account.<BR><BR>" + "<a href=\"" + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" + userName.Encrypt("verify") + "\">" + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" + userName.Encrypt("verify") + "</a>"; SendEmail(to, "", "", "Account created! Email verification required.", msg); }
Encrypt方法如下所示:
public static string Encrypt(string clearText, string Password) { byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText); PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)); return Convert.ToBase64String(encryptedData); }
这是Hotmail中的HTML外观:
请单击下面的链接或将其粘贴到浏览器中以验证您的电子邮件帐户。 http:// localhost:1563 / Accounts / VerifyEmail.aspx?a = YOHY57xYRENEOu3H + FGq1Rf09AZAI56EPjfwuK8XWKg =
请单击下面的链接或将其粘贴到浏览器中以验证您的电子邮件帐户。
http:// localhost:1563 / Accounts / VerifyEmail.aspx?a = YOHY57xYRENEOu3H + FGq1Rf09AZAI56EPjfwuK8XWKg =
在接收端,VerifyEmail.aspx.cs页面的行如下:
string username = Cryptography.Decrypt(_webContext.UserNameToVerify, "verify");
这是UserNameToVerify的获取方法:
public string UserNameToVerify { get { return GetQueryStringValue("a").ToString(); } }
这是GetQueryStringValue方法:
private static string GetQueryStringValue(string key) { return HttpContext.Current.Request.QueryString.Get(key); }
解密方法如下所示:
public static string Decrypt(string cipherText, string password) { **// THE ERROR IS THROWN HERE!!** byte[] cipherBytes = Convert.FromBase64String(cipherText);
可以通过代码修复纠正此错误,还是必须将ViewState存储在数据库中?
base64编码的字符串的长度始终是4的倍数。如果不是4的倍数,=则会附加字符直到它被附加。?name=value当value包含字符时,该格式的查询字符串会出现问题=(其中一些将被删除,我不记得确切的行为)。=在执行base64解码之前,您也许可以添加正确数量的字符。
=
?name=value
value
编辑1
您可能会发现UserNameToVerifyhas 的值已"+"更改为" ",因此您可能需要执行以下操作:
UserNameToVerify
"+"
" "
a = a.Replace(" ", "+");
这应该使长度正确;
int mod4 = a.Length % 4; if (mod4 > 0 ) { a += new string('=', 4 - mod4); }
当然,打电话来UrlEncode(如LukeH的回答)应该可以解决所有问题。
UrlEncode