C# 在ASP.NET MVC中,当应用程序池重新循环时会发生什么?

C# 在ASP.NET MVC中,当应用程序池重新循环时会发生什么?,c#,asp.net-mvc,asp.net-mvc-4,session,C#,Asp.net Mvc,Asp.net Mvc 4,Session,我在服务器上大量使用会话来存储客户端发出的请求的数据。在研究中,关于stackoverflow的各种答案都指向我,而不是在ASP.NETMVC中使用Session。主要原因是:应用程序池在生产服务器的生命周期内频繁回收,这也会导致会话回收 这就是为什么我想用可反序列化的字符串“…”替换会话对象的原因。 我的全部顾虑是:这个包含这个字符串的单例对象(可以反序列化为对象)不能在应用程序池重新循环时损坏/回收或重新初始化 所以我的最后一个问题是:应用程序池回收会发生什么?只有会话重新循环?还是整个内存

我在服务器上大量使用会话来存储客户端发出的请求的数据。在研究中,关于stackoverflow的各种答案都指向我,而不是在ASP.NETMVC中使用Session。主要原因是:应用程序池在生产服务器的生命周期内频繁回收,这也会导致会话回收

这就是为什么我想用可反序列化的字符串“…”替换会话对象的原因。 我的全部顾虑是:这个包含这个字符串的单例对象(可以反序列化为对象)不能在应用程序池重新循环时损坏/回收或重新初始化

所以我的最后一个问题是:应用程序池回收会发生什么?只有会话重新循环?还是整个内存重新循环并重新初始化


我的目标web服务器:Microsoft ASP.NET和MVC

回收应用程序池将吹走AppDomain及其所有内容,包括所有静态值

这就是为什么它首先会丢失会话状态


您可能需要一个数据库。

SLaks几乎回答了您的问题。以下是解决方案-

在ASP.NETMVC中,我们不使用类似Web表单的会话状态

但是,您仍然可以使用会话状态,但您希望使用外部会话状态提供程序而不是默认值-值和变量存储在本地Web服务器的内存中

你别无选择-

  • 状态服务器

当应用程序回收时,网站运行的windows进程将结束,并创建一个新进程。一个站点对于一个应用程序池也可能有多个工作进程。在这种情况下,它们全部结束,1个旋转起来,并根据需要创建新的工作进程

发生这种情况时,网站代码存储在内存中的任何内容都将丢失。这包括进程内会话信息

但是.Net会话状态可以在两种模式下工作:进程中模式或数据库模式。您可以运行aspnet_regsql工具在sql server中创建一个用于存储会话信息的数据库。然后,您可以更改web.config以在数据库中运行会话。您可以使用相同的会话API,它们在两种模式下的工作方式相同。但将其置于数据库模式会导致它将所有内容持久化到数据库中,而不是进程内存中。当AppPool回收时,您不会损失任何东西

RegSql文档:


一个设计良好的ASP.Net站点(无论是MVC、Web表单、WebApi(1/2))等,都应该能够从任何回收中完全恢复。网站回收不应破坏您的网站。

例如,我有一个单例用户定义的集合。它也会消失并爆炸?此用户定义的集合将包含可反序列化为对象的字符串。我想保留des可序列化字符串。因此,此单例集合也将消失?单例将在新的应用程序域中重新初始化-当应用程序池回收时,应用程序域中的所有内存状态都将丢失。同样值得注意的是,应用程序不需要在会话中存储太多,实际上什么都不需要。我已经构建了数百个应用程序,但从未使用过会话。我使用Cookie,但我唯一这样做的时候是,如果我需要JS层中的数据来保存跨页面加载以维护UI状态,比如记住您在哪个选项卡上,等等。这还考虑了声明身份验证,其中可以包含身份验证层中状态所需的信息(用户id、用户名、角色等)这仍然是一个问题。只是在这个旧答案的基础上再加上一句,你真的不应该使用会话。依我看,这是糟糕的代码气味。严重依赖会话可能会创建不符合web标准的应用程序。比如不能为url添加书签,因为新用户无法正确设置要加载的会话状态。它导致了发展中的许多错误。相反,您应该使用自己的持久性,如数据库,即Entity Framework 6+,或PetaPoco等,并使用sql server或postgreSql等支持它。因此,如果您不使用会话,您可能会想,如何根据请求获取内容?你在每一个请求上查找它,你打db电话来获取它。现在是2021年,与其担心在后端缓存东西,不如让UI在前端缓存。使用带有url状态等的SPA式设计,前端缓存内容,后端不必担心。99%的时间。仍然有一些情况下缓存是有意义的,但缓存不需要涉及会话状态。