首页 文章

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

提问于
浏览
2

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

Thatswhy我想用反序列化的字符串“....”替换会话对象 . 我完全担心的是:这个包含此字符串的单例对象(反序列化为对象)不得在应用程序池重新循环中损坏/回收或重新初始化 .

所以我的最后一个问题是:app pool-recycle会发生什么?只有会话重新循环?或者整个内存重新循环并重新初始化?

我的目标Web服务器:带有MVC的Microsoft ASP.NET

3 回答

  • 2

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

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

    但是.Net会话状态可以在两种模式下工作,在进程中或数据库中 . 您可以运行aspnet_regsql工具在sql server中创建一个用于存储会话信息的数据库 . 然后,您可以更改web.config以使会话在数据库中运行 . 您可以使用相同的会话api,它们在两种模式下的工作方式相同 . 但是将它置于数据库模式会导致它将每个标志持久保存到数据库而不是进程内存中 . 然后,当AppPool Recycles,你什么也没有失去 .

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

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

  • 1

    回收应用程序池会吹掉AppDomain及其中的所有内容,包括所有静态值 .

    这就是它首先失去会话状态的原因 .

    您可能想要一个数据库 .

  • 1

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

    在ASP.Net MVC中,我们不像Web Form那样使用Session State .

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

    你有几个选择 -

相关问题