14

在相当多的情况下,放置app_offline.htm在根目录中是正确的:您进行一些更新,更新时出现消息,就是这样。正如微软所说,这个想法是,在调用任何内容之前,IIS 首先检查 app_offline.htm 是否存在,如果存在,它会取消所有内容并显示它。

所以很好,但在许多情况下它不起作用:

  • 当您在 ASPX 页面中出现编译错误并且用户直接链接到该页面时
  • 当您有冲突的程序集时
  • 当您的 web.config 中出现解析错误时
  • 在删除/上传整个网站的过程中。
  • 指向静态 HTML 页面的直接链接仍然显示为这样
  • 在显示消息之前抛出未找到文件、拒绝访问

可能存在更多失败的场景。我的观点是:对于任何严肃的更新工作,app_offline.htm 都不适合。我有时会在 IIS 中创建重定向到另一个站点,但另一个站点可能并不总是可用,它可能会使用户感到困惑。

理想情况下,我希望将当前位置保留在最终用户的 url 位置栏中,显示消息,并让页面每分钟自动刷新一次以查看站点是否返回,以便用户继续他的位置网站返回时的左侧。虽然静态页面在技术上很容易,但由于上述原因,一旦出现错误,它就会失败。

4

6 回答 6

10

没有其他人提到 web.config 和重新编译,所以就在这里。我遇到过这个问题。我不同意那个说它“不适合产品使用”的人:VS 2010 在部署时使用 app_offline,因此它被嵌入到代码中。

解决方法(感谢 Kurt Schindler,此处的博客文章)。

  1. 将 app_offline.htm 复制到您的站点
  2. 制作一个看起来像这样的 web.config(参见下面的编号块)
  3. 将该 web.config 复制到您的远程目录
  4. 将除真正的 web.config 之外的所有站点文件复制到远程目录
  5. 将真实的 web.config 复制到远程目录(应该开始重新编译)

网络配置:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
  <system.web>
    <httpRuntime waitChangeNotification="300"
       maxWaitChangeNotification="300"/>
  </system.web>
  <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"  />
  </system.webServer> 
</configuration>

这样做的结果是,如果您关心最终用户在部署期间看不到 YSOD ,您将无法直接使用 VS 2010 应用程序部署。因此,您需要使用 Nant 或其他一些部署工具来执行此操作。

于 2011-06-18T20:07:19.980 回答
6

我在许多访问量非常大的网站上看到处理此问题的一种方法是在 inetpub 目录中有多个文件夹。就像是:

inetpub
     \ site2011-02-03 
     \ site2011-03-14

其中“site2011-02-03”是现有站点,“site2011-03-14”是今天推送的站点。推送到新文件夹完成后,您将 IIS 站点更改为指向新目录。如果失败,您将 IIS 更改为旧版本。

坦率地说,在使用 app_offline.htm 时,我从未遇到过您所说的错误。它始终可以正常运行以将站点关闭;即使是直接链接到页面。我猜你可能有其他事情发生在这里。我已经使用了 IIS 7 和 7.5 (2008 R2)。

更新
刚刚查看了我们的配置。我们将 app_offline.htm 映射为服务器上的顶级默认文档。这可能是一个缓解因素。

于 2011-03-14T20:38:03.593 回答
3

我喜欢在您的实际网络应用程序处于离线状态时使用“离线”网络应用程序的想法。您将在您的 Web 目录上设置一个符号链接以指向相应的应用程序。

您的设置可能如下所示:

Web_Dir(这是 IIS 为 www.yourdomain.com 提供服务的目录)
WebApps

  • 实际WebApp
  • 离线网络应用

场景:您的应用在线
Web_Dir -> ActualWebApp(Web_Dir 链接到 ActualWebApp)

场景:您的应用离线
Web_Dir -> OfflineWebApp(Web_Dir 链接到 OfflineWebApp)


本质上,您最终会得到两个不同的 Web 应用程序:一个实际的 Web 应用程序和一个“离线”Web 应用程序。这使您可以灵活地将用户重定向到另一个站点,但保持您的域的外观 - 因为它是!

实际的 Web 应用程序是真正的 Web 应用程序。这是您要更改的内容,并且具有您的实际内容。

“离线”网络应用程序的内容很少。也许它只包含您在问题中提到的静态页面。也许它有一些路由来处理任何页面请求,显示离线消息,并每分钟重新加载。

您的 IIS Web 目录实际上是这两个 Web 应用程序之一的链接。通常,它将链接到您的实际网络应用程序。当您准备好开始(重新)部署您的 Web 应用程序时,您可以将您的 Web 目录更改为指向“离线”应用程序。部署完成后,您将链接改回,使其再次指向真正的 Web 应用程序。

于 2011-03-14T20:03:10.520 回答
0

我不认为 app_offline.htm用于生产用途。

我的解决方案是创建一个单独的 Web 应用程序,其中包含一个模块,该模块捕获所有请求并将它们重定向到静态 .htm 页面,其中包含请求站点的查询字符串和一些 javascript 以重试原始请求。

当您准备好进行维护时,设置虚拟应用程序来处理对您的域的所有请求。在进行维护时使用不同的端口或临时域,以便进行测试。完成后,将它们切换回来,决定等待的用户应该被重定向到他们最初请求的页面。

我之前只完成了一半(切换应用程序端口以打开更新的站点),因此可能需要其他步骤来获得所需的用户体验。

希望这可以帮助。

于 2011-03-14T20:01:21.380 回答
0

在我们的例子中,app_offline.htm 在我们注释掉 web.config 页面的部分之前无法工作。取消注释后,它将重定向到我们定义的错误页面,而不是预期的 app_offline.htm。

于 2013-10-02T18:45:30.573 回答
0

旧帖子,我知道,但我还没有看到这个:

  1. 使用 app_offline.htm 创建一个新站点。
  2. 将 app_offline.html 添加到正在更新的站点。
  3. 从正在更新的站点中删除绑定。
  4. 添加绑定到 appOffline 站点。
  5. 将特殊绑定添加到目标站点(使用端口号或其他一些虚名 url,进行 ip 过滤或您需要的任何其他操作。)
  6. 在目标站点上进行验证。
  7. 从 appOffline 恢复绑定到目标站点。
于 2015-11-30T15:54:05.227 回答