IIS 8服务器上每晚都会重置Web应用程序中的列表

DoI*_*oIt 0 c# asp.net iis arraylist asp.net-mvc-4

我开发了一个Asp.Net MVC Web应用程序并将其部署在IIS 8 Server上,在我的应用程序中,我使用一个列表来存储在线用户并使用以下代码在页面中显示它们

if (HttpRuntime.Cache["LoggedInUsers"] != null)
                {
                    List<string> loggedInUsers = (List<string>)HttpRuntime.Cache["LoggedInUsers"];

                    if (loggedInUsers.Contains(model.UserName))
                    {
                    }
                    else
                    {
                        loggedInUsers.Add(model.UserName);
                        HttpRuntime.Cache["LoggedInUsers"] = loggedInUsers;
                    }
                }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,列表每晚都会被清除,当我查找活跃用户时,我看到它是空的.

是否必须在IIS 8上处理,或者有更好的方法来实现使用数据库表的在线用户可能是..

LB2*_*LB2 5

IIS可以回收您的应用程序池(出于多种原因,包括空闲和没有请求,内存使用过多等等).此时,您的应用程序将被卸载,然后再次加载.因此,您的缓存值已消失.

其次,您是否有任何代码在某些时候修剪并从缓存中删除旧条目?如果没有,这意味着你有内存泄漏,因为它将继续无限增长(从而触发应用程序池回收).

如果你确实有prunning代码(因此缓存被主动管理以避免无限增长),并且你需要它的内容在池重启后继续存在,那么你有几个选择:

  • 使用数据库.只需拥有一个活跃用户表并在那里添加/删除.
    • 亲:即使是应用程序,iis甚至机器本身的意外崩溃都能幸免于难.
    • Con:由于db访问和db争用点可能性而变慢.
  • 将代码放入应用程序的开始/结束事件处理程序,以将内容序列化为文件,并在开始时反序列化.
    • 亲:快于db.在优雅的停工期间工作.
    • 骗局:由于意外崩溃将无法运作.