客户端通过每个请求通过多个IP连接时ViewState解码失败

时间:2008-12-05 07:55:21

标签: asp.net viewstate

我们的网站存在一个半怪异的问题。

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

  

异常类型:System.FormatException

     

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

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

根据我的判断,禁用“ViewStateMAC”应解决此问题。

我不确定,并且没有任何方法可以与用户一起测试,我觉得有点不愿意继续这样做。

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

服务器详细信息:

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

更新

根据我的判断,ViewStateMAC仅适用于服务器端。我的问题是由于客户回复了一个包含多个IP的页面。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

但是 - 我最近在具有有效长度的viewstate字段上收到了错误 - 但是__EVENTVALIDATION字段长度对此无效。

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

答案 1 :(得分:1)

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

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

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

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