【问题标题】:ViewState decoding failure when client connects via multiple IP's per request当客户端通过每个请求通过多个 IP 连接时,ViewState 解码失败
【发布时间】:2008-12-05 07:55:20
【问题描述】:

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

始终,来自 1 个匿名* 用户会发生以下错误:

异常类型:System.FormatException

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

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

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

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

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

服务器详情:

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

更新:

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

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

【问题讨论】:

  • 您找到解决方案了吗?
  • @JohannesH:不,也不需要,18 个月前从那个项目中被裁掉了。

标签: asp.net viewstate


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 问题是重新创建它......也不使用 ViewStateUserKey 。用户使用的是 FF 2.0.0.9。不幸的是,我不能在服务器上使用 Fiddler :(。但是谢谢。
    • 另外,用户是匿名的。我们从 IIS 日志中收集信息,并看到对于相同的回发,客户端来自不同的 IP,但主机名相同(通过解析 IP)。
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多