每隔几分钟就有视图状态损坏的ASP.NET应用程序

时间:2010-01-24 16:00:02

标签: asp.net asp.net-2.0 viewstate

我正在处理我正在管理的网络应用程序的问题。用户偶尔会收到以下错误:

  

viewstate MAC验证失败。如果   此应用程序由Web托管   农场或集群,确保    配置指定   相同的validationKey和验证   算法。无法使用AutoGenerate   在群集中。

问题在于它不是集群 - 它是单个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个不同的页面中,因此非常频繁。

我喜欢这个解决方案 - 是否有人知道在单个服务器上可能导致视图状态错误的其他原因,或者我可以采取哪些措施来确保其正确验证?

2 个答案:

答案 0 :(得分:3)

听起来好像工作进程本身正在回收(假设您正在进行会话状态存储)。选择固定密钥意味着当进程恢复时,视图状态仍然有效,但是您已经丢失了会话状态。您可以尝试将会话状态存储在数据库中,但我更关心的是修复底层问题。您的应用程序是否会突然分配大量内存或类似内容?事件日志中有什么可疑的东西吗?

答案 1 :(得分:0)

事实证明,当我向运行我们的应用程序的应用程序池添加其他工作流程时,这种情况就开始发生了。因为会话状态是存储在InProc中(而不是在状态服务或SQL Server中),所以当用户在工作进程之间切换时,它正在失去对用户的跟踪。现在,将我们服务器上的进程数量减少到一个已经纠正了问题,因为提高它似乎没有任何改进。