gpt4 book ai didi

.net - 从 .NET 3.0 升级到 3.5 : Sites set to StateServer revert to InProc when in Web Garden

转载 作者:行者123 更新时间:2023-12-04 17:14:15 26 4
gpt4 key购买 nike

设想:

以运行 .NET 3.0 的服务器和在启用了 Web 园的应用程序池中运行的 ASP.NET 网站为例(进程数:3)。 web.config 配置如下:

< session 状态
cookieless="UseCookies"
cookieName=".authz"
模式=“状态服务器”
regenerateExpiredSessionId="true"
stateConnectionString="tcpip=127.0.0.1:42424"
超时=“60”
useHostingIdentity="true"/>

现在将机器升级到 .NET 3.5 SP1。重新启动服务器。结果: session 不再跨 w3wp.exe 的实例进行维护,就好像所有实例都已恢复到 InProc。减少到 1 个工作进程是当前的解决方法。

奇怪的是:不同服务器上的相同代码没有问题。我以前也遇到过这个问题,但是重启后就神奇的消失了。我已经重新启动了一次,但到目前为止还没有快乐。

比较两台服务器的两个machine.configs和web.configs:相同。

Someone else has experienced this problem ,但那里没有答案。

有任何想法吗?我真的被这个难住了。

最佳答案

所以,这个真是太棒了。

当以下所有条件都为真时,似乎会出现此问题:

  • 您正在运行 Windows Server 2003 (IIS 6.0) 和一个 ASP.NET 2.0 网站。
  • 该网站配置为使用 Web Gardens,其中最大工作进程数大于 1。因此,您已将应用程序配置为使用进程外 session 存储;在这种情况下,ASP.NET 状态服务在本地机器上运行。
  • 应用程序池标识未设置为 NETWORK SERVICE,而是设置为您根据 deployment best practice 创建的自定义低权限用户帐户。 .
  • 您运行更新 .NET 框架的安装程序;就我而言,这是从 .NET 3.0 到 .NET 3.5 SP1 的更新。

  • 当升级完成并重新启动服务器时,您会发现刷新页面时 session 变量经常丢失,因为只有三分之一的机会获得为原始请求提供服务的原始工作进程。但这无关紧要,因为您使用的是 ASP.NET 状态服务。什么破了?

    使用 ASP.NET 状态服务时,ASP.NET 使用名为 machineKey 的值。加密和/或散列所有要存储的 session 数据(我不知道它是加密还是散列还是两者兼而有之,但这不是本次讨论的重要区别)。这样,当任何工作进程使用 session 标识符从服务中请求数据时,可以确保数据在存储在外部数据源中时没有被篡改。

    如果您在网络农场中,那么您可能有一个静态 machineKey在您的 web.config 中定义文件,则不会出现此问题。但是对于单服务器 Web 花园场景,您可能依赖于默认的 machineKey设置,设置为 AutoGenerate,IsolateApps用于 ASP.NET 2.0 应用程序。这意味着 ASP.NET 会自动生成一个对您的应用程序池唯一的机器 key 。它根据某种算法重新生成此 key ,但这对于本次讨论并不重要。

    生成的值通常存储在注册表中 HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\AutoGenKeys\{SID of the Application Pool Identity} 下.但是 .NET Framework 安装程序错误地(我确实认为这是一个错误)破坏了这个注册表项,而且雪上加霜的是,重置了这个键的权限,这样你的自定义应用程序池标识在它运行时就无法写入注册表项创建它的新机器 key 。

    结果是,在网络花园中启动的每个工作进程都在使用它自己及时生成的机器 key 的内存副本,从而有效地意外创建了网络农场场景。例如,工作进程 A 启动,看到没有 AutoGenKey条目存在(实际上,它甚至无法读取它),生成自己的条目并开始使用它来散列发送到 ASP.NET 状态服务的数据。它尝试将此新机器 key 保存到注册表项中,但无提示地失败。工作进程 B 启动,看到没有 AutoGenKey条目存在,生成自己的条目并开始使用它来散列数据……你知道这是怎么回事。

    结果是现在您拥有使用三个不同机器 key 散列的 session 数据。尽管 session 标识符的数据存在,但三分之二的工作进程将拒绝它作为无效/篡改,因为它使用自己的 key 。

    您可以通过显式设置自定义 machineKey 来解决此问题。在您的 web.config文件。

    或者你可以重新运行 aspnet_regiis.exe -ga MachineName\ApplicationPoolUserName在命令提示符下修复损坏的权限。

    你的问题解决了。是时候去 sleep 了。

    6 月 30 日更新:根据我在 Microsoft Connect 上对此问题的报告,Microsoft 表示他们已经修复了安装程序,这样从升级到 .NET 4 开始就不会发生这种行为。在 future 的所有 3.0/3.5 升级中仍然可能发生这种情况,所以我会保留这个问题/答案。

    关于.net - 从 .NET 3.0 升级到 3.5 : Sites set to StateServer revert to InProc when in Web Garden,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/526697/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com