【发布时间】: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吗?如果是这样,客户端仍然有角度应用程序在他身边,那么您无法检查<!--Offline-->,因为它在您要加载的文件中?还是我理解的问题颠倒了? -
@Kaddath,当您将
app_offline.htm放在站点的根目录中时,IIS 应该为每个请求而不是实际请求的内容提供服务,但现在我想知道它是否仅适用于 ASP .NET 内容 - 这可以解释为什么我仍然看到我的部分内容通过。我现在正在测试它。也许这是一个 IIS 配置问题。我正在检查添加runAllManagedModulesForAllRequests="true"是否会强制为所有类型的内容提供app_offline.htm。
标签: javascript angularjs