在ASP.NET中丢失会话ID

在ASP.NET中丢失会话ID,asp.net,session,Asp.net,Session,我遇到了Asp.NET会话ID的问题。每当有代码隐藏更改并将dll移动到服务器/如果对web.config文件进行了任何修改,则无法访问现有会话。会话id将重置 如果使用stateserver,则可以保留会话值。但在某些共享托管环境中,这是不可能的 是否有其他方法可以在不考虑更改的情况下保留会话值?还有基于SQL server的会话。您可能无法使用共享主机设置此设置。但是如果可以,它工作得很好。它的好处是非常持久。即使服务器停机,会话也将保留。这几乎是我使用会话的唯一方式 下面有一篇文章解释了如

我遇到了Asp.NET会话ID的问题。每当有代码隐藏更改并将dll移动到服务器/如果对web.config文件进行了任何修改,则无法访问现有会话。会话id将重置

如果使用stateserver,则可以保留会话值。但在某些共享托管环境中,这是不可能的


是否有其他方法可以在不考虑更改的情况下保留会话值?

还有基于SQL server的会话。您可能无法使用共享主机设置此设置。但是如果可以,它工作得很好。它的好处是非常持久。即使服务器停机,会话也将保留。这几乎是我使用会话的唯一方式

下面有一篇文章解释了如何设置它:


如果幸运的话,您的共享主机提供商可以帮助您实现这一点,因为这可以让他们的所有客户受益。

另一个选择是尝试使网站不使用会话。我可能是错的,但我认为这就是如此。我不知道关于SO的具体情况,但你可以随时从cookie读/写。这将在代码更改中保持不变


这实际上是我准备在我的一个项目中尝试实现的东西,以消除会话超时。它在我的脑海里非常新鲜,所以我想我会把它扔出去

除了基于Sql Server的会话之外,您还可以在服务进程中存储会话。这称为进程外模式

您可以在此处找到有关会话状态的介绍:
在我的测试中,session.sessionid没有被重置。但是,存储的会话变量正在丢失


我建议使用asp.net会话id可访问的会话数据表(以db为单位)。因此,应用程序回收不会影响会话表。由于sessionid未更改,您仍然可以访问确切的会话变量。

无论何时更改web.config,都会导致IIS应用程序池被回收。当应用程序池回收时,会话中存储的所有对象都将丢失。将此最小化的最佳方法(不转到进程外[因此状态服务器、Sql Server或分布式缓存,如memcache或Velocity])是简单地限制发布更新的频率。在“凌晨1点”(负载低时)将其熄灭。否则,进程外(Sql Server可能是共享环境中的最佳选择,但祝您在性能上好运)可能是您的最佳选择