我大量使用 Session 将来自客户端的已发布请求的数据存储在服务器上。在研究中,stackoverflow 上的各种答案都指向我,不要在 ASP.NET MVC 中使用 Session。主要原因是:应用程序池在生产服务器的生命周期内频繁回收,这导致 session 也被回收。
这就是为什么我想用可反序列化的字符串“....”替换 session 对象。 我的全部顾虑是:这个包含此字符串的单例对象(能够反序列化为 Objects )不得损坏/回收或在应用程序池回收时重新初始化。
所以我的最后一个问题是:app pool-recycle 会发生什么?只有 session 再循环?还是整个内存重新循环并重新初始化?
我的目标网络服务器:带有 MVC 的 Microsoft ASP.NET
最佳答案
当应用程序回收时,站点正在 w3wp.exe
中运行的 Windows 进程结束并创建一个新进程。一个站点也可能有一个应用程序池的多个工作进程。在那种情况下,它们都结束并且 1 旋转起来,并且将根据需要创建新的工作进程。
发生这种情况时,网站代码存储在内存中的任何内容都会丢失。这包括进程中的 session 信息。
但是 .Net session 状态可以在两种模式下工作,在进程中或数据库中。可以运行aspnet_regsql工具在sql server中创建一个数据库用于存储session信息。然后您可以更改 web.config 以在数据库中运行 session 。您可以使用相同的 session api,它们在两种模式下的工作方式相同。但是将其置于数据库模式会导致它将所有内容持久保存到数据库而不是进程内存中。然后,当 AppPool 回收时,您不会丢失任何东西。
RegSql 文档:https://msdn.microsoft.com/library/ms229862(v=vs.100).aspx
一个设计良好的 ASP.Net 站点(无论是 MVC、Web 窗体、WebApi(1/2))等应该被设计成能够从任何回收中完全恢复。网站回收不应破坏您的网站。
关于c# - 当应用程序池在 ASP.NET MVC 中重新循环时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994243/