我有一个构建 HTML 电子邮件的应用程序。内容中包含一个编码的 URL 参数,例如,可能包含促销代码或产品参考。电子邮件由 Windows 服务(本质上是控制台应用程序)生成,并且链接在单击时由 MVC 网站处理。以下是创建电子邮件链接的代码:
string CreateLink(string domain, string code) {
// code == "xyz123"
string encrypted = DES3Crypto.Encrypt(code); // H3uKbdyzrUo=
string urlParam = encrypted.EncodeBase64(); // SDN1S2JkeXpyVW890
return domain + "/" + urlParam;
}
MVC控制器上的action方法构造如下:
public ActionResult Index(string id) {
string decoded = id.DecodeBase64();
string decrypted = DES3Crypto.Decrypt(decoded);
...
}
在我们所有的测试中,这种机制都按预期工作,但是,现在我们已经上线,我们看到大约 4% 的错误率,从 base-64 转换失败,但有以下异常:
输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非空白字符。
来自 url 的 id 参数“看起来”OK。问题似乎与失败的 EncodeBase64/DecodeBase64 方法有关,因为 DecodeBase64 方法在失败时返回“乱码”字符串,例如“�nl����□��7y�b�8�sJ���=”链接。
此外,大多数错误来自 IE6 用户代理,导致我认为这是字符编码问题,但我不明白为什么。
作为参考,这是我的 base-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;
}
任何建议将不胜感激。