什么是经常损坏的app_offline.htm hack的建议替代方案?

时间:2011-03-14 17:05:08

标签: asp.net app-offline.htm

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

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

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

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

理想情况下,我希望将当前位置保留在最终用户的网址位置栏中,显示消息,并让网页每分钟自动刷新以查看网站是否已恢复,以便用户当网站回来时他继续离开。虽然在静态页面上技术上很容易,但是在抛出错误的那一刻,它会因上述原因而失败。

6 个答案:

答案 0 :(得分:10)

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

解决方法(归功于Kurt Schindler,blog post here)。

  1. 将app_offline.htm复制到您的网站
  2. 制作一个看起来像这样的web.config(见下面编号的块)
  3. 将该web.config复制到您的远程目录
  4. 将除真实web.config之外的所有站点文件复制到远程目录
  5. 将真实的web.config复制到远程目录(应启动重新编译)
  6. 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或其他部署工具来执行此操作。

答案 1 :(得分: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映射为我们服务器上的顶级默认文档。这可能是一个减轻因素。

答案 2 :(得分:3)

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

您的设置可能如下所示:

  

Web_Dir(这是目录   IIS服务www.yourdomain.com)   的WebApp

     
      
  • ActualWebApp
  •   
  • OfflineWebApp
  •   

场景:您的应用已在线
Web_Dir - &gt; ActualWebApp(Web_Dir链接到ActualWebApp)

场景:您的应用处于离线状态
Web_Dir - &gt; OfflineWebApp(Web_Dir链接到OfflineWebApp)


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

实际的网络应用程序是真正的网络应用程序。这是您要更改的内容以及包含实际内容的内容。

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

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

答案 3 :(得分:0)

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

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

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

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

希望这有帮助。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

  1. 使用app_offline.htm创建新网站。
  2. 将app_offline.html添加到正在更新的网站。
  3. 从正在更新的网站中删除绑定。
  4. 将绑定添加到appOffline网站。
  5. 为目标网站添加特殊绑定(使用端口号或其他虚荣网址,进行ip过滤或其他任何你需要的。)
  6. 在目标网站上进行验证。
  7. 从appOffline恢复绑定到目标站点。