2010-01-24 40 views
1

我遇到了一个我正在管理的Web应用程序的问题。偶尔会出现以下错误的用户:ASP.NET应用程序每隔几分钟就会损坏视图状态

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

问题是它不是一个集群 - 它是一台Windows 2003服务器。周围挖之后,似乎增加了的machineKey部分和一些额外的属性到页面在我的web.config指令解决这个错误:

<machineKey validationKey='MACHINE KEY SNIPPED' 
     decryptionKey='DECRYPTION KEY SNIPPED' 
     validation='SHA1'/> 

<pages validateRequest="true" enableEventValidation="false"> 

在我的web.config改变这两样东西后,错误消失,但现在我有一个新问题 - 而不是一个错误,我的viewstate无效,应用程序只是“忘记”我的用户是谁,并将它们发送回登录页面。现在,用户正在浏览应用程序,然后他们意外地被发送到登录页面,即使他们已经登录了几分钟。虽然我不能强迫这种情况发生,但通常会在访问10-12个不同的页面时发生,因此经常发生。

我很想解决这个问题 - 是否有人知道还有什么可能导致单个服务器上的视图状态错误,或者我能做些什么来确保它的正确验证?

+0

永远不要关闭事件验证。有一个非常狭窄的时间你想要做到这一点,并试图绕过导致你的应用程序池回收的东西不是其中之一。现在,如果攻击者知道他们在做什么,他们将能够触发事件以禁用页面上的隐藏控件。 – blowdart 2010-01-24 16:27:10

+0

你在做网址重写吗?如果是这样的网址被设置为匹配页面,表单验证反对?使用相同的错误消息更改表单验证toasts查看状态。 – 2010-01-24 18:24:29

+0

任何解决方案? – Kiquenet 2011-01-04 09:52:10

回答

0

事实证明,当我向正在运行我们的应用程序的应用程序池中添加额外的工作进程时,开始发生这种情况。由于会话状态被存储在InProc中(而不是存储在状态服务或SQL Server中),因此会丢失用户在工作进程间切换时的用户身份。就目前而言,将服务器上的进程数量减少到一个可以解决问题,因为提高它似乎没有任何改进。

3

听起来好像工作进程正在自我回收(假设你正在存储进程中的会话状态)。选择固定键意味着视图状态在进程恢复时仍然有效,但是您失去了会话状态。您可以尝试将会话状态存储在数据库中,但我更关心解决基本问题。您的应用程序是否突然分配大量内存或类似的东西?事件日志中是否有任何可疑内容?

+1

@rwmnau:如果事实证明如此,您可能需要从流程中提取会话。不需要拥有InProc会话,您需要使用SQL或状态服务器。这也意味着确保你的自定义类是可序列化的。 – 2010-01-24 17:00:58

+1

工作进程不应该无故回收.. :-) – Robert 2010-01-24 20:11:20

+0

工作进程有其原因,其原因不知道;-) – 2010-01-24 21:39:34

相关问题