注销回收

时间:2012-04-22 13:17:41

标签: asp.net .net iis-7

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

3 个答案:

答案 0 :(得分:3)

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

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

如果使用SQL Server存储会话,则可以避免服务器丢失会话信息。 Session-State modes on MSDN

答案 1 :(得分:2)

答案是令人惊讶的,它与我在我的应用程序中记录的视图状态错误有关,我在其中一个MSDN sites找到了正确的解释,特别是这一行:

  

关于machineKey

     

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

总之,所有必须做的事情都是generating a machine key而且回收不再导致用户重新进行身份验证。

答案 2 :(得分:0)

你写过你试过StateServer模式,但是stateserver模式就像sqlserver一样工作如果我不知道它错了。可以从Windows服务启动StateServer,在web.config中可以设置服务器的IP地址(启动和运行状态服务器)。

如果stateserver不能以某种方式为你工作,我怀疑sql server会。问题可能出在我感觉到的另一个领域。

  

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

     

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

     

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

     

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

     

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

     

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

     

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