【问题标题】:How to reload the page if the server is offline?如果服务器离线,如何重新加载页面?
【发布时间】:2017-05-12 00:17:18
【问题描述】:

在部署我们的应用程序时,我们使用app_offline.htm 告诉 IIS 使我们的应用程序不可用。如果有任何客户端已经加载了 Angular 应用程序,我想做的是在应用程序离线时拦截对服务器的任何请求,然后重新加载页面,以便显示 app_offline.htm 而不是 Angular 应用程序。

我认为这就像将 <!--Offline--> 或其他东西放在 app_offline.htm 的顶部一样简单,然后有一个 http 拦截器来检查是否有任何响应以它开头,但我似乎从来没有得到 @987654326 的内容@在回复中。令人惊讶的是,我仍然在响应中获得应用内容。我想知道它是否可能正在提取内容的缓存版本或其他内容。如果我手动重新加载页面,我会按预期获得app_offline.htm 页面。

那么如何检测服务器是否不可用并重新加载页面呢?

更新

所以这似乎更像是一个 IIS 配置问题。 app_offline.htm 文件似乎只影响由 ASP.NET 管理的资源。从this answer,我了解到您可以使用以下代码配置 ASP.NET MVC 来处理所有请求:

<?xml version="1.0"?>
<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
</configuration>

即使app_offline.htm 存在,这也可以防止提供诸如 HTML 之类的静态内容,但它似乎还会继续以undefined 作为响应而不是触发来触发 Angular http 拦截器的“响应”处理程序带有状态为 503 服务不可用的对象的“responseError”处理程序。我对使用此解决方案犹豫不决,因为我不知道是否有其他条件可能导致 undefined 响应,但到目前为止它似乎正在工作:

function appOfflineHttpInterceptor($window, $q) {
    return {
        'response': function (response) {
            if (typeof response == "undefined")
                $window.location.reload();

            return response || $q.when(response);
        }
    };
}

有谁知道是否有其他条件会导致未定义的响应 - 这会使该解决方案不可行?

【问题讨论】:

  • 一个快速的解决方案是,如果您使用 ajax 调用(或同等),只需在客户端检查错误响应(或响应中的状态标志)并从客户。与window.location.href。为了获得更好的解决方案,您必须分享更多信息。 :-D
  • @winner_joiner,你会想,但我没有收到任何错误响应。我不知道为什么。
  • 如果没有错误响应,可能至少会出现超时错误。或者您的 IIS 是否继续为调用提供服务?如果超时不起作用,您能否提供更多关于系统如何工作的信息以提供更好的解决方案。(最后一个选项很少用户可以每隔几秒钟汇集一次服务器,但有很多用户,您可以杀死服务器)
  • 也许我没有得到正确的问题,但问题不在于您想在应用程序不可用时加载app_offline.htm 吗?如果是这样,客户端仍然有角度应用程序在他身边,那么您无法检查&lt;!--Offline--&gt;,因为它在您要加载的文件中?还是我理解的问题颠倒了?
  • @Kaddath,当您将 app_offline.htm 放在站点的根目录中时,IIS 应该为每个请求而不是实际请求的内容提供服务,但现在我想知道它是否仅适用于 ASP .NET 内容 - 这可以解释为什么我仍然看到我的部分内容通过。我现在正在测试它。也许这是一个 IIS 配置问题。我正在检查添加 runAllManagedModulesForAllRequests="true" 是否会强制为所有类型的内容提供 app_offline.htm

标签: javascript angularjs


【解决方案1】:

只是根据您目前提供的信息进行猜测。您的服务器是否将app_offline.htm 作为普通页面提供服务。换句话说,它是否发送了一个 HTTP 状态码 200 OK?如果是这样,这就是您在 ajax 调用中看不到错误的原因。

您可以使用 503 Service Unavailable 为页面提供服务,这会在您的 ajax 请求中触发错误处理程序。然后您可以有条件地处理 503 并重定向整个加载的应用程序页面。

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多