asp.net - 当客户端通过每个请求通过多个 IP 连接时,ViewState 解码失败

标签 asp.net viewstate

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

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

Exception type: System.FormatException

Exception message: Invalid length for a Base-64 char array.

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

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

不过我不确定,而且没有任何办法与用户进行测试,我有点不愿意继续这样做。

有没有人遇到过类似的问题?你是如何对待他们的?

服务器详细信息:

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

更新:

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

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

最佳答案

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

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

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

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

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

关于asp.net - 当客户端通过每个请求通过多个 IP 连接时,ViewState 解码失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/343153/

相关文章:

asp.net - 修改 View 状态中的项目 - 这样做安全吗?

c# - ASP.Net生命周期和控制状态和 View 状态

ASP.NET 导出到 Excel - 锁定单元格

asp.net - 使用带有 GET 方法和操作参数的 MVC Html.BeginForm

c# - ASP.NET - 在不序列化的情况下保存在 View 状态中

asp.net - 在父级中禁用时,如何为子级自定义控件启用 ViewState?

c# - .net c#一次加载XML文件的方法

c# - 使用 asp.net 和 C# 集成 Paypal

asp.net - 间歇性 "Failed to load viewstate"错误

c# - asp.net + Viewstate 和逗号分隔的字符串