2

在生产环境中,我有一个 IIS 托管的 asp.net 应用程序,实际上是许多 Web 应用程序。每个应用程序都会消耗大量内存,但目前限制它的唯一方法是回收(nHibernate 似乎正在泄漏内存,并且它正在创建大量字符串集合)。问题是在回收之后它会不断注销用户还是放弃会话?在本地计算机上,我无法重现该问题。我试过使用状态服务器但没有运气,问题还在继续,SQL 状态保存会改变什么,还是我只是错过了铅或错过了什么?

4

3 回答 3

3

当应用程序池被回收时,如果会话数据存储在内存中(InProc,默认值),所有会话都将丢失。

会话是通过在用户浏览器中放置一个带有密钥的 cookie 并将该密钥保存在服务器状态机上来创建的。

如果您使用 SQL Server 存储会话,您将避免服务器丢失会话信息。MSDN 上的会话状态模式

于 2012-04-22T13:28:14.690 回答
2

答案令人惊讶,它与我在应用程序中登录的视图状态错误有关,我在MSDN 站点之一上找到了正确的解释,尤其是这一行:

关于 machineKey

“[...] 当应用程序池在用户帐户下运行时,不会生成上述密钥,从而导致间歇性无效视图状态错误。”

总之,所有必须做的就是生成一个机器密钥,并且回收不会导致用户重新进行身份验证。

于 2012-05-15T10:55:26.597 回答
0

你写了你尝试过 StateServer 模式,但 stateserver 模式像 sqlserver 一样工作,如果我不知道它错了。StateServer 可以从 Windows 服务启动,并且在您的 web.config 中您可以设置您的服务器 IP 地址(哪个状态服务器已启动并正在工作)。

如果 stateserver 不适合你,我怀疑 sql server 会。问题可能出在我觉得的另一个领域。

ASP.NET 会话状态支持会话数据的几种不同存储选项。每个选项都由 SessionStateMode 枚举中的值标识。以下列表描述了可用的会话状态模式:

InProc 模式,将会话状态存储在 Web 服务器的内存中。这是默认设置。

StateServer 模式,它将会话状态存储在称为 ASP.NET 状态服务的单独进程中。这可确保在重新启动 Web 应用程序时保留会话状态,并且还使会话状态可用于 Web 场中的多个 Web 服务器。

SQLServer模式将会话状态存储在 SQL Server 数据库中。这可确保在重新启动 Web 应用程序时保留会话状态,并且还使会话状态可用于 Web 场中的多个 Web 服务器。

自定义模式,可让您指定自定义存储提供程序。

关闭模式,禁用会话状态。

您可以通过将 SessionStateMode 枚举值分配给应用程序 Web.config 文件中 sessionState 元素的 mode 属性来指定希望 ASP.NET 会话状态使用的模式。InProc 和 Off 以外的模式需要其他参数,例如本主题后面讨论的连接字符串值。您可以通过访问 HttpSessionState.Mode 属性的值来查看当前选定的会话状态。

于 2012-04-22T13:51:56.620 回答