3

我们的网站有一个半奇怪的问题。

一致地,来自 1 个匿名 * 用户会发生以下错误:

异常类型:System.FormatException

异常消息:Base-64 字符数组的长度无效。

经过一番调查,用户似乎正在使用某种形式的负载平衡防火墙,因为 IIS 日志显示来自 2 个不同(但连续)IP 的请求。

据我所知,禁用“ViewStateMAC”应该可以解决这个问题。

但是我不确定,并且没有任何方式与用户进行测试,我觉得有点不愿意继续这样做。

有没有人遇到过类似的问题?你是怎么对付他们的?

服务器详情:

从单个 IP 运行的单个服务器 (Win2003)。

更新:

据我所知,ViewStateMAC 仅适用于服务器端。我的问题是由于客户发回具有多个 IP 的单个页面。

* 但来自 IIS 日志确定的相同 2 个 IP。用户也没有恶意。

4

2 回答 2

3

嘿 - 我们在应用程序上看到异常数量的这些错误 - 由于客户要求和缺乏对这些错误的指导 - 在每个页面上使用了过多的控件,特别是 GridViews。

明显的罪魁祸首是视图状态的长度,在某些极端情况下是 +50k 个字符长。由于这是一个仅由有限的一组用户使用的管理应用程序,我们最初通过使用这篇出色的(您略过时的)文章中概述的解决方案的改编版本将视图状态移动到会话中完全解决了这个问题:http: //msdn.microsoft .com/en-us/magazine/cc163577.aspx 然而,这给我们带来了人们使用后退按钮和/或标签浏览的问题。

接下来,我们添加了一些额外的日志记录代码 - 并确认问题确实正是错误所说的 - base-64 编码的字符串必须具有可被 4 整除的长度 - 当我们得到这个错误时,情况并非如此。假设是某些代理和/或防火墙我们只是在某些时候切断了视图状态字符串。然后,我们使用 ASP.NET 的 ViewStateChunking 将字段拆分为几个隐藏字段 - 我们仍在监视此解决方案。

但是-我最近在具有有效长度的视图状态字段上遇到错误-但是 __EVENTVALIDATION 字段长度对此无效。

在发生这种情况的页面上,我们的字段中有“+”号(电话代码) - 我目前正在调查这一切是否可能是由原始字符串的无效编码引起的(因为 + 号在 base 中具有特殊含义-64 结束字符串)。

于 2010-01-22T12:46:58.267 回答
1

禁用 viewstatemac 并不能解决问题;ViewStateMac 故障发生在您有多个 Web 服务器时,而不是当用户来自多个 IP 地址时。

您是否有机会使用 viewstateuserkey?即使那样,这也是一个很长的机会,因为你会得到一个不同的例外。

我很想,如果用户可以在一致的基础上重新创建它,让他们安装 fiddler 并记录请求,直到它发生,然后让他们将它们发送给你。然后从您身边重播它们,看看是否发生错误。

他们不是在 Mac 上使用 IE 吗?由于表单字段长度中的错误,这会破坏长视图状态。

于 2008-12-05T11:07:24.587 回答