繁体   English   中英

当应用程序池在 ASP.NET MVC 中回收时会发生什么?

[英]What happens when application pool re-cycles in ASP.NET MVC?

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

这就是为什么我想用可反序列化的字符串“....”替换会话对象。 我的全部担忧是:包含此字符串的单例对象(可反序列化为 Objects )不得在应用程序池回收时损坏/回收或重新初始化。

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

我的目标网络服务器:Microsoft ASP.NET with MVC

当应用程序回收时,该站点在w3wp.exe运行的 Windows 进程结束并创建一个新进程。 一个站点也可能有一个应用程序池的多个工作进程。 在这种情况下,它们都结束并且 1 旋转,并且将根据需要创建新的工作进程。

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

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

RegSql 文档: https ://msdn.microsoft.com/library/ms229862(v = vs.100).aspx

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

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

这就是它首先丢失会话状态的原因。

你可能想要一个数据库。

SLaks 几乎回答了你的问题。 这是解决方案 -

在 ASP.Net MVC 中,我们不像 Web Form 那样使用会话状态。

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

你有几个选择——

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM