2012-11-05 26 views
5

我希望我可以在这里更具体,但不幸的是这可能很难。我基本上希望这是一个“很好”已知的超时或设置问题。运行JavaScript setInterval的网站在〜1天后开始失败

我们有一个网站在工厂的屏幕上运行(JS/html - ASP.net项目)网站概述。这个屏幕没有键盘,所以它应该永远刷新页面 - 也许多年(尽管1周可能没关系)。 (工厂工人使用它来看传入的运输等)

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

我已经尝试了几件事情试图重现错误我自己,包括:

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

无论如何;该网站恢复正确的功能,无需刷新,只要我插上网线或其他任何东西 - 我不能重现错误。

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

编辑:我试图重现错误的浏览器是IE/win7。我明天会问工厂,但我猜IE /胜利?也。

setInterval实际上是真的无限还是有其他的错误呢?

所有帮助非常感谢。

更新: 在网站更新代码的catch子句中,在离开网站以调试模式运行并断点的情况下,我今天上午来了。 有一个2分钟。超时错误(可能在晚上繁忙的服务器清理),然后永远地后,在这条线的空引用错误:

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

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

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

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

我们现在尝试自动刷新的东西。

+0

+1因为我有一个类似的系统,并有兴趣知道这是否是一个问题。 – chead23

+0

什么浏览器/操作系统/硬件......这可能是一整套不同的事情,说实话。 – Dabloons

+0

如果你刷新整个页面,这不应该是一个问题。如果代码使用ajax加载新内容,那么内存泄漏可能导致脚本最终失败。 – Pointy

回答

3

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

如果是这种情况,您最终可能会追查哪种资源泄漏并修复了真正的问题,但即使这样做,一些浏览器在运行很长的进程时也会遇到它们自己的问题。

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

只是在做这个(触发每六小时):

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

不会只给你一个干净的开始,也将自动使您的应用检索任何服务器端更改您可能必须做出该应用每隔一段时间一次,所以如果您发布错误修复,它将在几个小时内自动部署。

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

+1

@MartinClemensBloch - 不,我不是BTC。您可以用绿色复选标记标记答案作为选定的答案。 – jfriend00

+0

是的,不用担心,一旦我确认了确切的解决方案;) –

1

我想你被应用程序池的回收所咬。这将重置服务器端应用程序并终止所有会话(至少如果您使用in-proc会话,这是默认设置)。这个回收可以安排在03:00发生,所以这就是为什么你不会在常规调试会话中看到它,但只有当你让它在一夜之间运行。

您可以在该web服务中检查会话的存在。如果会话为空,返回一个特殊的值触发页面(您的接收JavaScript代码)完成页面的重新加载,这将创建一个新的会话。这样您就不必等待预定的页面超时来重新填充页面。

0

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