C# 在ASP.NET MVC中,当应用程序池重新循环时会发生什么?
我在服务器上大量使用会话来存储客户端发出的请求的数据。在研究中,关于stackoverflow的各种答案都指向我,而不是在ASP.NETMVC中使用Session。主要原因是:应用程序池在生产服务器的生命周期内频繁回收,这也会导致会话回收 这就是为什么我想用可反序列化的字符串“…”替换会话对象的原因。 我的全部顾虑是:这个包含这个字符串的单例对象(可以反序列化为对象)不能在应用程序池重新循环时损坏/回收或重新初始化 所以我的最后一个问题是:应用程序池回收会发生什么?只有会话重新循环?还是整个内存重新循环并重新初始化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。主要原因是:应用程序池在生产服务器的生命周期内频繁回收,这也会导致会话回收 这就是为什么我想用可反序列化的字符串“…”替换会话对象的原因。 我的全部顾虑是:这个包含这个字符串的单例对象(可以反序列化为对象)不能在应用程序池重新循环时损坏/回收或重新初始化 所以我的最后一个问题是:应用程序池回收会发生什么?只有会话重新循环?还是整个内存
我的目标web服务器:Microsoft ASP.NET和MVC回收应用程序池将吹走AppDomain及其所有内容,包括所有静态值 这就是为什么它首先会丢失会话状态
您可能需要一个数据库。SLaks几乎回答了您的问题。以下是解决方案- 在ASP.NETMVC中,我们不使用类似Web表单的会话状态 但是,您仍然可以使用会话状态,但您希望使用外部会话状态提供程序而不是默认值-值和变量存储在本地Web服务器的内存中 你别无选择-
- 状态服务器
- 李>
一个设计良好的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%的时间。仍然有一些情况下缓存是有意义的,但缓存不需要涉及会话状态。