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)
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编码的字符串
正如其他人所提到的,当某些防火墙和代理阻止访问包含大量ViewState数据的页面时,可能会导致这种情况.
ASP.NET 2.0引入了ViewState Chunking机制,该机制将ViewState分解为可管理的块,允许ViewState无问题地通过代理/防火墙.
要启用此功能,只需将以下行添加到web.config文件中.
<pages maxPageStateFieldLength="4000">
Run Code Online (Sandbox Code Playgroud)
这不应该用作减少ViewState大小的替代方法,但它可以是针对"侵略性代理等"导致的"Base-64 char数组的无效长度"错误的有效后退.