【问题标题】:Website running JavaScript setInterval starts to fail after ~1day运行 JavaScript setInterval 的网站在 ~1 天后开始失败
【发布时间】:2012-11-05 16:48:38
【问题描述】:

我希望我可以在这里更具体,但不幸的是,这可能很难。我基本上希望这是一些“众所周知的”超时或设置问题。

我们有一个网站在工厂的屏幕上运行(JS/html - ASP.net 项目)网站概览。这个屏幕没有键盘,所以它应该永远刷新页面——也许几年(尽管 1 周可能没问题)。 (工厂工人用它来查看进货等)

这一切都完美无缺;该站点不断自我更新并获取新的正确数据。 然后,有时,早上这个“概览”屏幕没有数据,工作人员必须使用简单的刷新按钮或 F5 手动刷新站点 - 这可以解决所有问题。

我自己尝试了一些尝试重现错误的方法,包括:

  1. 切断互联网连接和许多其他使其超时的方法(断点、停止服务等)。
  2. 设置setInterval的刷新时间为100ms,让站点运行3-5分钟。 (正常计时器为 1 分钟)
  3. 根据我所做的互联网搜索,setInterval 应该永远运行。
  4. 检查了“JavaScript 频率”没有在省电设置中关闭。

无论如何;一旦我再次插入互联网电缆或其他任何东西,该网站就会恢复正确的功能而无需刷新 - 我无法重现错误。

该网站依赖于后端 WCF 服务和项目集成,但由于工作人员正在通过简单的刷新来解决此问题,我假设这没有崩溃。

编辑:我尝试在其中重现错误的浏览器是 IE/win7。我明天会问工厂,但我猜是IE/win?也。

setInterval 实际上是无限的还是这里有其他问题?

非常感谢所有帮助。

更新: 我今天早上离开网站以调试模式运行后,在网站更新代码的 catch 子句中设置了一个断点。 有 2 分钟。超时错误(可能在夜间忙于清理服务器),然后在此行出现空引用错误:

var showHistory = (bool)Session.Contents["ShowHistory"];

我像工人一样刷新了它。 我现在认为这可能是会话超时,尽管我们一直在 ping 服务器。 当然,我的特定会话超时可能是由于断点导致它在第一次超时时永远挂起 - 行为仍然与工厂相同。 稍后我会确保向你们更新最终解决方案。

更新 2:测试正在进行中。

更新 3:工厂是 IE 9,他们的测试机器是 IE 7,我的机器是 IE 9。在周末运行后,在 IE7 上看到了错误,但在我的 IE9 上没有看到。 我们尝试在关键的 data_binding 代码期间关闭 ajax 缓存,但它什么也没做。 我测试了内存泄漏,如果我每分钟刷新 100 次,就能够产生不错的泄漏。我不认为这是问题所在,并且刷新清除了所使用的内存。

我们现在将尝试自动刷新。

【问题讨论】:

  • +1,因为我有一个类似的系统,很想知道这是否真的是一个问题。
  • 什么浏览器/操作系统/硬件...老实说,这可能是一整套不同的东西。
  • 如果您要刷新整个页面,这应该不是问题的内在原因。如果代码使用 ajax 加载新内容,那么内存泄漏可能导致脚本最终失败。
  • 您可以尝试每隔一段时间使用<meta http-equiv="refresh" content="21600"> 之类的方式使页面自动刷新(相当于F5)。这应该使页面每 6 小时刷新一次并重置间隔。
  • 当您说“刷新本身”时,您的意思是页面已重新加载吗?还是有更新内容的ajax调用?如果您只是重新加载整个页面,setInterval 毫无意义。

标签: c# javascript asp.net wcf


【解决方案1】:

setInterval() 应该永远存在。但是,您的脚本/页面可能会泄漏某种资源,最终导致页面脚本或浏览器内部出现错误。

如果是这种情况,您可能最终可以追踪到哪种资源正在泄漏并解决真正的问题,但即使这样做,一些浏览器也存在运行时间很长的问题。

可能值得关注资源使用情况,看看页面运行时间越长浏览器内存使用情况是否会上升。但是,由于 F5 修复了它,我建议作为安全措施,您只需每隔几个小时就重新加载一次页面。在大多数现代浏览器中,页面重新加载会释放与先前页面运行相关的所有资源,并从这个角度为您提供一个干净的状态。

只需这样做(每六个小时触发一次):

setTimeout(function() {
    window.location.reload(true);
}, 6 * 1000 * 60 * 60);

不仅会给您一个全新的开始,还会让您的应用每隔一段时间自动检索您可能对应用所做的任何服务器端更改,因此如果您发布错误修复,它将自动部署几个小时内。

您也可以在页面中使用元刷新标签。

【讨论】:

  • @MartinClemensBloch - 不,我不在 BTC 上。您只需将带有绿色复选标记的答案标记为选定答案即可。
  • 是的,别担心,一旦我确认了确切的解决方案;)
【解决方案2】:

我猜你被应用程序池的回收所困扰。这将重置服务器端应用程序并终止所有会话(至少如果您使用进程内会话,这是默认设置)。此回收可能安排在 03:00 发生,这就是为什么您在常规调试会话中看不到它,但只有在您让它整夜运行时才会看到它。

您可以检查该网络服务中是否存在会话。如果 Session 为 null,则返回一个特殊值,该值会触发页面(您接收的 javascript 代码)来完全重新加载页面,这将创建一个新的 Session。这样您就不必等待计划的页面超时来重新填充页面。

【讨论】:

    【解决方案3】:

    此处未提及的一种解决方案是将 cookie 设置为具有滑动过期时间。我们最终做了几件不同的事情,但一个问题是用户身份验证/cookie 超时,然后用户被移至登录屏幕。

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      相关资源
      最近更新 更多