我大量使用Session来存储服务器上来自客户端的已发布请求的数据。在研究中,关于stackoverflow的各种答案都指向我,而不是在ASP.NET MVC中使用Session。主要原因是:应用程序池在生产服务器的生命周期内频繁回收,这也导致会话也回收。
因此,我正在考虑用反序列化的字符串“ ....”替换会话对象。我的整个担心是:包含此字符串(可以反序列化为Object)的单例对象一定不能损坏/回收或在应用程序池回收时重新初始化。
所以我的最后一个问题是:在应用程序池回收中会发生什么?仅会话循环?还是整个内存重新循环并重新初始化?
我的目标Web服务器:带有MVC的Microsoft ASP.NET
当应用程序回收时,该站点正在运行的Windows进程w3wp.exe
最终结束,并创建了一个新进程。一个站点可能对一个应用程序池有多个工作进程。在这种情况下,它们全部结束并且旋转1,然后将根据需要创建新的工作进程。
发生这种情况时,网站代码存储在内存中的所有内容都会丢失。这包括处理中会话信息。
但是,.Net会话状态可以在两种模式下运行,即进程模式或数据库模式。您可以运行aspnet_regsql工具在sql服务器中创建一个数据库,用于存储会话信息。然后,您可以更改web.config以使会话在数据库中运行。您可以使用相同的会话api,它们在两种模式下均相同。但是,将其置于数据库模式会使它将所有内容持久化到数据库中,而不是存储在进程内存中。然后,当AppPool回收时,您什么也不会损失。
RegSql文档:https ://msdn.microsoft.com/library/ms229862(v = vs.100).aspx
设计良好的ASP.Net网站(无论是MVC,Web窗体,WebApi(1/2))等都应设计为能够从任何回收中完全恢复。网站回收不应破坏您的网站。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句