导致这个"Base-64 char数组的长度无效"的原因

Sli*_*lim 89 .net asp.net viewstate exception

我没有什么可以继续下去的.我无法在本地重现,但当用户收到错误时,我会收到一封自动电子邮件异常通知:

Invalid length for a Base-64 char array.

  at System.Convert.FromBase64String(String s)
  at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
  at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
  at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
  at System.Web.UI.HiddenFieldPageStatePersister.Load()
Run Code Online (Sandbox Code Playgroud)

我倾向于认为分配给viewstate的数据存在问题. 例如:

List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;
Run Code Online (Sandbox Code Playgroud)

如果不能在本地重现错误,很难猜出错误的来源.

如果有人对此错误有任何经验,我真的很想知道你发现了什么.

Jal*_*aer 83

在urlDecode处理文本之后,它将所有'+'字符替换为''...因此错误.你应该简单地调用这个语句使它再次兼容base 64:

        sEncryptedString = sEncryptedString.Replace(' ', '+');
Run Code Online (Sandbox Code Playgroud)

  • 刚刚遇到这个问题就像你说的那样是空格,用`+`替换它.英雄! (3认同)

Jim*_*uts 36

我看到这个错误是由大小合适的视图状态和积极的内容过滤设备/防火墙组合引起的(特别是在与K-12教育机构打交道时).

我们通过在SQL Server中存储Viewstate来解决它.在走这条路线之前,我建议尝试限制你对viewstate的使用,不要在其中存储任何大的东西,并为所有不需要它的控件关闭它.

在SQL Server中存储ViewState的参考:
MSDN - PageStatePersister
ASP联盟概述- 在SQL Server 代码项目中存储视图状态的简单方法
- ViewState Provider Model


Jon*_*eet 21

我的猜测是某些东西要么经常编码或解码 - 要么就是你有多行文字.

Base64字符串的长度必须是4个字符的倍数 - 每4个字符代表3个字节的输入数据.不知何故,ASP.NET传回的视图状态数据已损坏 - 长度不是4的倍数.

发生这种情况时,您是否记录用户代理?我想知道它是否是一个表现糟糕的浏览器...另一种可能性是有一个代理做顽皮的事情.同样,尝试记录请求的内容长度,以便您可以查看它是否仅适用于大型请求.


Pet*_*ník 12

试试这个:

public string EncodeBase64(string data)
{
    string s = data.Trim().Replace(" ", "+");
    if (s.Length % 4 > 0)
        s = s.PadRight(s.Length + 4 - s.Length % 4, '=');
    return Encoding.UTF8.GetString(Convert.FromBase64String(s));
}
Run Code Online (Sandbox Code Playgroud)


小智 10

int len = qs.Length % 4;
            if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');
Run Code Online (Sandbox Code Playgroud)

其中qs是任何base64编码的字符串


Red*_*Taz 8

正如其他人所提到的,当某些防火墙和代理阻止访问包含大量ViewState数据的页面时,可能会导致这种情况.

ASP.NET 2.0引入了ViewState Chunking机制,该机制将ViewState分解为可管理的块,允许ViewState无问题地通过代理/防火墙.

要启用此功能,只需将以下行添加到web.config文件中.

<pages maxPageStateFieldLength="4000">
Run Code Online (Sandbox Code Playgroud)

应该用作减少ViewState大小的替代方法,但它可以是针对"侵略性代理等"导致的"Base-64 char数组的无效长度"错误的有效后退.