正如标题所说,我得到了:

Base-64字符的长度无效 array.

我在这里读到过这个问题,看起来 如果视图状态很大,建议将其存储在SQL中.我是 使用具有大量数据收集的向导,因此有可能 我的视图状态是否很大.但是,在我转向"Store-in-DB"之前 解决方案,也许有人能看一看,告诉我有没有 还有其他 Select 吗?

我使用以下方法构建要交付的邮箱:

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);
}

加密方法如下所示:

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=

在接收端,验证邮箱.aspx.cs page有这样一句话:

 string username = Cryptography.Decrypt(_webContext.UserNameToVerify, "verify");

以下是UserNameToVerify的getter:

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的倍数,则会追加=个字符,直到达到4为止.当value包含=个字符时,表单?name=value的查询字符串就会出现问题(其中一些字符会被删除,我记不清具体的行为了).在执行Base64解码之前,您也许可以添加正确数量的=个字符.

编辑1

您可能会发现,UserNameToVerify的值已将"+"更改为" ",因此您可能需要这样做:

a = a.Replace(" ", "+");

这应该得到正确的长度;

int mod4 = a.Length % 4;
if (mod4 > 0 )
{
    a += new string('=', 4 - mod4);
}

当然,拨打UrlEncode(就像LukeH的答案一样)应该会让这一切变得毫无意义.

Asp.net相关问答推荐

我可以将图像添加到 ASP.NET 按钮吗?

在 DataTextField 中组合两个字段.这可能吗?

是否可以在没有那些 .svn 文件夹的情况下从 subversion 签出文件?

取消选中时 ASP.NET CheckBox 不会触发 CheckedChanged 事件

为什么我在安装 IE8 后无法从 Visual Studio 2005 调试?

如果站点在 localhost 或 127.0.0.1 上运行,如何判断 ASP.NET MVC 视图

IIS 6/ASP.NET Windows 身份验证 list ?

如何使用文件上传控件 Select 多个文件?

HttpWebRequest 未通过凭据

如何在 ASP.NET 应用程序中使用 jQuery 捕获提交事件?

在 C# 中将 IHtmlContent/TagBuilder 转换为字符串

ASP.NET URL 重写

如何从 HTTP 请求中获取 MAC 地址?

在 asp.net 中将 JSON 转换为 .Net 对象时出错

ASP.NET web.config:system.web.compilation 中的 debug 属性的默认值是什么?

如何将 LINQ 左外连接限制为一行

MVC3 和实体框架

ASP.NET 身份提供程序 SignInManager 不断返回失败

ASP.NET 中的嵌套中继器

如何将 DataTable 转换为类 Object?