从 .NET 3.0 升级到 3.5:在 Web Garden 中设置为 StateServer 的站点恢复为 InProc

2024-04-02

设想:

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



    <sessionState
      cookieless="UseCookies"
      cookieName=".authz"
      mode="StateServer"
      regenerateExpiredSessionId="true"
      stateConnectionString="tcpip=127.0.0.1:42424"
      timeout="60"
      useHostingIdentity="true" />
  

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

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

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

其他人也遇到过这个问题 http://forums.iis.net/t/1153948.aspx,但那里没有答案。

有任何想法吗?我是really被这个难住了。


所以,这真是太棒了。

当满足以下所有条件时,就会出现此问题:

  • 您正在运行 Windows Server 2003 (IIS 6.0) 和 ASP.NET 2.0 网站。
  • 该网站配置为使用网络花园,其中工作进程的最大数量大于 1。因此,您已将应用程序配置为使用进程外会话存储;在这种情况下,ASP.NET State Service 在本地计算机上运行。
  • 应用程序池标识未设置为 NETWORK SERVICE,而是设置为您根据应用程序创建的自定义低权限用户帐户。部署最佳实践 http://msdn.microsoft.com/en-us/library/ms998297.aspx.
  • 您运行更新 .NET 框架的安装程序;就我而言,这是从 .NET 3.0 到 .NET 3.5 SP1 的更新。

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

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

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

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

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

结果是现在您拥有使用三个不同机器密钥进行哈希处理的会话数据。尽管会话标识符的数据存在,但三分之二的工作进程会将其拒绝为无效/被篡改,因为它使用自己的密钥。

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

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

你的问题已经解决了。是时候去睡觉了。


6月30日更新:根据我关于此问题的报告微软连接 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=412881,微软表示他们已经修复了安装程序,这样从升级到 .NET 4 开始就不会发生这种情况。对于未来的所有 3.0/3.5 升级,这种情况仍然可能发生,所以我将保留这个问题/答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 .NET 3.0 升级到 3.5:在 Web Garden 中设置为 StateServer 的站点恢复为 InProc 的相关文章

  • 直接将 .aspx 转换为 .pdf [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 浏览器关闭时 Omniauth 会话过期

    在我的 Rails 3 应用程序中 我使用 Omniauth 进行用户身份验证部分 fb twitter 实际上我遵循这个 https github com RailsApps rails3 mongoid omniauth https g
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • 如何创建可点击的gridview行?

    我想创建一个 gridview 行 其中整行都是可单击的 当我单击该行上的任意位置时 它会打开另一个包含行信息的 aspx 页面 我正在使用 asp net 和 C 任何人都可以帮助我吗 提前致谢 触发 Gridview 的两个事件 OnR
  • 使用 IAsyncEnumerable 对另一个服务或 API 进行异步调用并批量返回响应

    我正在尝试创建一个 API 一旦准备好就返回结果 目标是 准备就绪后立即生成结果的 API 端点 消费应用程序调用端点并在数据准备好后立即处理数据 我的 API 调用另一个服务 HttpGet Route stream public asy
  • 如何使用 WebResponse 下载 .wmv 文件

    我使用以下代码通过 WebResponse 获取 wmv 文件 我正在使用一个线程来调用这个函数 static void GetPage object data Cast the object to a ThreadInfo ThreadI
  • OWIN 可以替代 ASP.NET MVC 应用程序中的 DI 吗?

    大约一年前 在 Visual Studio 中创建时自动生成的 MVC 项目不包含任何有关 OWIN 的内容 作为再次申请并试图了解这些变化的人 我想知道 OWIN 是否可以替代我的 DI 据我了解 Startup Auth cs 中的以下
  • 使用 PHP 对 ASP.NET 成员身份中的用户进行身份验证

    我在尝试使用 PHP 针对现有 ASP NET 成员资格数据库对用户进行身份验证时遇到一些问题 我在网上搜索过 发现现有的答案似乎对我不起作用 即 public static function Hash password salt deco
  • 存储在 Session 中的变量在整个页面生命周期中是否反序列化一次或多次?

    我想以类似的方式包装会话变量在 CodeProject 上讨论 http www codeproject com KB aspnet wrapthosesessionvariables aspx msg 2315287 public sta
  • 如何在静态方法中获取会话变量的值?

    我正在使用带有 jQ uery 的 ASP NET 页面方法 如何在 C 中的静态方法中获取会话变量的值 protected void Page Load object sender EventArgs e Session UserName
  • 当checked属性为false时,单选按钮默认被选中?

    我正在尝试生成单选按钮 有条件地检查检查的属性 如果该值存在于数据库中 则应选择它 否则检查的属性为 false 所以最初数据库中没有行 所有单选按钮的检查属性也为 false 但仍然在 UI 上选择 请参见下图 所以不知道这是默认行为还是
  • MVC2 中隐藏字段的替代方案

    我有一个 viewModel 其中包含一个在传递给部分视图之前填充的字符串 我需要能够在发布表单时取回数据 目前我已经创建了一个隐藏字段并将数据绑定到它 然后 当回发时 我可以从表单集合中获取数据 这并不完全是我想要的 我希望数据完全隐藏在
  • 获取所有查询字符串对并初始化字典的最佳方法

    我想将所有键 值对存储在我的查询字符串中 www example com a 2 b 3 c 34 进入字典 有没有一种快速的方法可以做到这一点 而无需手动循环所有项目 Try HttpUtility ParseQueryString 它给
  • Api 控制器中长时间运行的任务(使用 Web API,自托管 OWIN)

    我想在自托管 OWIN 环境中的 ApiController 中运行长时间运行的任务 例如 4 5 分钟 但是 我想在开始该任务后 一旦开始长时间运行的任务 就发回响应 而不等待它完成 这个长时间运行的任务与 HTTP 无关 并且顺序运行一
  • 如何将 Integer8 值转换为 DateTime?

    如何将 Integer8 类型值转换为 DateTime 类型值 特别是 我正在尝试获得帐户过期采用人类可读形式的 Active Directory 用户属性 SearchResult GetDirectoryEntry Propertie
  • ASP.Net 应用程序中的音频/视频/文本聊天

    我需要在 ASP Net 中开发一个聊天系统 我已经浏览了很多关于类似主题的问题 但没有找到任何一个令人满意的 是否可以从头开始创建它 或者我是否需要使用一些 API 我的要求仅限于我的网站用户 可以说基于内联网 请帮我 要进行文字聊天 人
  • 如何为动态创建的按钮创建 onClick 事件处理程序

    目前 我正在为学生宿舍做一个项目 现在我必须实现一些关于学生的搜索策略 这里 当用户单击 aspx 页面中的另一个服务器按钮时 我必须动态创建一个按钮 因此我必须创建新创建的按钮的 onclick 事件处理程序 我使用的代码片段是 prot
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem

随机推荐