2014-05-07 28 views
0

我已经开发了一个Asp.Net MVC Web应用程序并将其部署在IIS 8服务器上,并在我的应用我用一个列表存储在线用户,并显示它们被重置在页面中使用下面的代码列表是每天晚上8 IIS服务器

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; 
        } 
       } 

出于某种原因,该列表被清除,每天晚上,当我寻找的活跃用户,我看到了空。

有什么事情对IIS 8予以处理或者是有使用数据库表可实现在线用户没有更好的办法..

+2

如果你想坚持的列表,从应用程序池回收,代码更新,服务器故障,等等 - 你应该保存这个在本地文本或XML文件或一个简单的数据库表。此列表在内存中 - 它不会持续通过任何应用程序重新启动(不管原因) – Tommy

回答

5

IIS可以回收您的应用程序池(有几个原因,其中包括空转且没有要求,太多的记忆使用等...)在这一点上你的应用程序将被卸载,然后再次加载。因此你的缓存值已经消失了。

其次,你有什么代码,在某些时候李子和从缓存中删除旧的条目?如果没有,这意味着你有内存泄漏,因为它会继续无限增长(从而触发应用程序池回收)。

如果你确实有P运转代码(所以缓存积极管理,以避免不确定的增长),你需要它的内容生存过去池重新启动,那么你有几种选择:

  • 使用数据库。只需拥有一个活跃用户的表格并在其中添加/删除。
    • 临:生存甚至意外崩溃应用程序,IIS,甚至是机器本身。
    • Con:由于db访问和db争用点的可能性而变慢。
  • 将代码放入您的应用程序开始/结束事件处理程序中,以将内容序列化到文件上,并在开始时反序列化。
    • Pro:比db快。在优雅的关机期间工作。
    • Con:由于意外崩溃而无法工作。
+1

+1,'Cache'不适用于持久性存储。 – David

0

您的网站可能在一定时间后关闭没有活动。看看应用程序池的IIS设置(更具体的“设置空闲超时在IIS中从来没有”)对谷歌...

+1

我认为你有正确的答案,但缺乏对此答案的努力量。而不是告诉某人Google,推断什么是空闲超时,应用程序池回收,然后链接到显示如何控制此设置的站点(例如MSDN,IIS.net)。 – Tommy

+0

谢谢,我将在未来尝试这个...即使它是正确的答案;) – MaxOvrdrv

相关问题