ASP.NET 应用程序每隔几分钟就会损坏一次视图状态
Posted
技术标签:
【中文标题】ASP.NET 应用程序每隔几分钟就会损坏一次视图状态【英文标题】:ASP.NET app having viewstate corrupted every few minutes 【发布时间】:2011-01-08 19:37:28 【问题描述】:我正在管理的网络应用程序出现问题。用户开始偶尔收到以下错误:
视图状态 MAC 验证失败。如果 此应用程序由 Web 托管 场或集群,确保 配置指定 相同的validationKey和validation 算法。无法使用自动生成 在一个集群中。
问题在于它不是一个集群——它是一个单一的 Windows 2003 服务器。在四处挖掘之后,似乎在我的 web.config 中的 Pages 指令中添加一个 machineKey 部分和一些额外的属性可以解决这个错误:
<machineKey validationKey='MACHINE KEY SNIPPED'
decryptionKey='DECRYPTION KEY SNIPPED'
validation='SHA1'/>
<pages validateRequest="true" enableEventValidation="false">
在我的 web.config 中更改这两件事后,错误消失了,但是 现在我遇到了一个新问题 - 我的视图状态无效的错误,应用程序只是“忘记”我的用户是谁,并将它们发送回登录页面。现在,用户正在浏览应用程序,然后他们意外地被发送到登录页面,即使他们已经登录了几分钟。虽然我不能强迫这种情况发生,但它通常发生在访问 10-12 个不同的页面时,非常频繁。
我很想解决这个问题 - 有没有人知道还有什么可能导致单个服务器上的视图状态错误,或者我可以做些什么来确保它得到正确验证?
【问题讨论】:
永远不要关闭事件验证。您想要执行此操作的时间非常有限,并且试图解决导致您的应用程序池回收的问题并不是那些时间之一。现在,如果攻击者知道他们在做什么,他们将能够触发您页面上禁用甚至隐藏控件的事件。 你在做url重写吗?如果是这样,是否将 url 设置为与页面匹配,表单验证?更改表单验证 toasts 视图状态并显示相同的错误消息.. 【参考方案1】:听起来好像工作进程正在回收自己(假设您正在进程中存储会话状态)。选择一个固定键意味着当进程恢复时视图状态仍然有效,但您已经丢失了会话状态。您可以尝试将会话状态存储在数据库中,但我更关心解决根本问题。您的应用程序是否突然分配了大量内存或类似情况?事件日志中有什么可疑之处吗?
【讨论】:
@rwmnau:如果是这种情况,您可能需要从进程中提取会话。您需要使用 SQL 或状态服务器,而不是使用会话 InProc。这也意味着确保您的自定义类是可序列化的。 工作进程有其原因,其中原因一无所知;-)【参考方案2】:事实证明,当我向运行我们的应用程序的应用程序池添加额外的工作进程时,这种情况就开始发生了。因为会话状态被存储在 InProc 中(而不是在状态服务或 SQL Server 中),所以当它在工作进程之间切换用户时,它会丢失用户是谁。目前,将我们服务器上的进程数降为 1 可以解决问题,因为一开始提高进程数似乎没有任何改善。
【讨论】:
以上是关于ASP.NET 应用程序每隔几分钟就会损坏一次视图状态的主要内容,如果未能解决你的问题,请参考以下文章