【问题标题】:Getting ViewStateException: Invalid viewstate while Machine keys are the same获取 ViewStateException:当机器键相同时​​视图状态无效
【发布时间】:2023-03-08 04:31:02
【问题描述】:

我在 LB 后面有 8 个主机,它们都是单进程(不是网络花园)。尽管如下所示使用 iis 中的相同机器密钥设置所有这些,但我仍然很少收到 Invalid viewstate 异常。

有类似的问题,但没有一个对我有帮助(我没有像其他问题一样等待更新或重新启动的服务器,或者我没有使用 server.execute 等)。所以请不要标记为重复。有没有其他方法可以防止这种异常?

谢谢

【问题讨论】:

    标签: asp.net exception iis viewstate machinekey


    【解决方案1】:

    通常,这是因为不同服务器的机器密钥不同。我们使用 Web Farm 来实现高可用性。在这种情况下,如果客户端发送请求,则负载均衡器会决定哪个 Web 服务器为请求提供服务。另一个请求可能由另一个服务器提供服务多次发生。那么问题来了。

    众所周知,视图统计是客户端状态管理技术,数据随请求和响应一起传播。因此,如果视图状态是用某个机器密钥加密的,而在其他请求中,如果由另一台服务器处理并且具有不同的机器密钥,它将无法解密它并会通过错误。

    每台服务器在设置为自动时都会生成一个新密钥。甚至有时应用程序域的任何回收都会在设置为自动时生成一个新密钥。这意味着我们不能使用默认的自动生成的密钥。所以这里的解决方案是在 machine.config 中使用特定的密钥来防止在每次进程启动时自动生成密钥。

    然而,另一种灵活的方法是将 MachineKey 部分添加到您网站的 web.config 文件中。这不需要在每个 Web 服务器上进行更改。

    另一种方法是您可以尝试在 machine.config 中设置以下代码:

    enableViewStateMac="false"
    

    【讨论】:

    • 谢谢 Jalpa,但正如我提到的,我已经为所有服务器设置了相同的机器密钥。我在许多使用网络农场的项目中使用了这种方法,但这次它没有解决视图状态问题。还有其他我可以测试的解决方案吗?顺便说一句,enableViewStateMac 是我的问题的根本原因,但这是出于安全考虑。
    • 您的所有站点是否也使用相同的机器密钥?您可以尝试将密钥设置为自动生成。
    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2011-04-20
    • 2020-03-05
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多