65.9K
CodeProject 正在变化。 阅读更多。
Home

自动从 Web 服务器故障中恢复

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (5投票s)

2004年7月20日

2分钟阅读

viewsIcon

38084

downloadIcon

408

本文解决了令人头疼的“页面无法显示”消息,并解释了如何使用 HTML 框架和 JavaScript 来捕获 Web 服务器故障,并在服务器恢复在线时自动重新连接。

Sample Image - ServerDown.jpg

引言

本文解决了令人头疼的“页面无法显示”消息,并解释了如何使用 HTML 框架和 JavaScript 来捕获 Web 服务器故障,并在服务器恢复在线时自动重新连接。它最适合于自动刷新的内部网应用程序,这些应用程序不一定需要用户一直操作(例如,制造工厂)。

背景

我编写的内部网应用程序在公司各处的屏幕上运行,并显示最新的统计数据。大多数情况下,没有用户站在屏幕前点击“刷新”按钮;页面使用 JavaScript 自动刷新。这工作得很好,直到 Web 服务器因计划停机或故障而停止工作。这会导致“页面无法显示”消息,并且页面不再尝试刷新自身。过去,这意味着需要到每台计算机上重新加载网页——一项简单的任务,但如果您有数百台计算机,那就麻烦了!

使用代码

此技术需要两个 HTML 文件来处理错误捕获和恢复。演示 VB.NET 项目包含这些文件以及 Home.aspx 作为示例自动刷新应用程序。设置的架构使用 HTML FRAMESET,如图下所示

Sample image

客户端使用 URL http://MyServer/MainFrame.html,其中包含 FRAMESET,其中包含两个 FRAMEMonitor.htmlHome.aspx。框架的设置方式是,Monitor.html 最初是隐藏的,而 Home.aspx 占据整个客户端区域

<FRAMESET id="FrameSet" 
          rows="0,*" 
          frameborder="0" 
          border="0">
   <FRAME SRC="Monitor.html">
   <FRAME SRC="Home.aspx">
</FRAMESET>

主应用程序负责刷新自身。关键在于 Monitor.html 页面,它检查另一个框架(Home.aspx)的 innerHTML,寻找错误迹象。它执行简单的字符串匹配,以查找类似“HTTP 404”或“页面可能暂时不可用”的内容。开发者需要根据需要制定必要的标准。

 function frameHasError() {
     try {
        var frameDoc= window.parent.frames(1).document;
        HTML= frameDoc.body.innerHTML;
        if (findText(HTML,"HTTP 404")) return true; 
        if (findText(HTML,"The page might be temporarily unavailable."))
          return true;
        if (findText(HTML,"Cannot find server or DNS Error")) 
          return true; 

        // TODO: Add additional search criteria
        lastURL= window.parent.frames(1).location.href;
     }
     catch(e) {
            return true;
     }           
     return false;
}

一旦此函数检测到错误,它就会接管,通过调整 FRAMESET 的大小,使其现在占据整个屏幕,并显示一条用户友好的消息,解释服务器不可用。然后它进入刷新循环(在本例中,每 5 秒刷新一次)刷新应用程序页面(Home.aspx)并检查错误。如果没有发现错误,则服务器必须已恢复。它将父 FRAMESET 重置回其原始状态(Monitor.html 隐藏)。

function checkStatus() {
    try {
        if (frameHasError()) {
            setFrameSize("100%");
            reloadFrame();
        }
        else {
            setFrameSize("0");
        }
    }
    catch(e) {
        setFrameSize("0");
    }

    window.setTimeout("checkStatus()",5000);
}
function setFrameSize(size) {
    var frameset=window.parent.document.getElementById("FrameSet");
    if (frameset) {
        frameset.rows=size + ",*";
    }
}

另一种恢复方法(此处未介绍)是在 web.config 中设置 .NET <customErrors> 重定向页面,指向包含类似逻辑的 HTML 页面。这样,您不仅可以捕获服务器故障,还可以捕获未处理的异常。

关注点

您可以编辑 Monitor.html 中的 JavaScript 来更改刷新时间和监控时间。此技术对网络负载较高,因此我仅建议将其用于需要自动刷新和从服务器故障中恢复的内部网应用程序。

© . All rights reserved.