【问题标题】:Redirect from Offline IIS to Maintenance Site从脱机 IIS 重定向到维护站点
【发布时间】:2019-12-16 22:38:22
【问题描述】:

为了向人们展示 IIS 应用程序池上的 ASP.Net 应用程序因维护而不是合法错误而停机,我需要将调用应用程序的一部分(也来自书签)的任何人重定向到通用维护页面。

首先我尝试了在应用根目录下使用 App_Offline 的路线。无济于事(IIS 已关闭,因此该站点无法运行)。然后我尝试了 http-redirection,但由于同样的原因,它不起作用。

【问题讨论】:

  • IIS 完全关闭了吗?还是只有一个站点?如果只是一个站点,您可以创建另一个带有错误页面的站点(以及一个 URL 重写规则以确保所有路径都命中错误消息),然后交换绑定,以便将用户定向到该站点。如果您需要更复杂的东西,您可能需要在客户端和 Web 服务器之间安装一个具有适当故障转移功能的负载平衡器。
  • 编辑了问题 - 只有 Applicationpool 处于离线状态

标签: asp.net iis


【解决方案1】:

您无需停止应用程序池。 app_offline.htm 的存在将关闭您的应用程序。有更多关于它如何工作的细节here

但是,这不会阻止 IIS 提供静态 HTML 文件。如果您将静态 HTML 文件作为应用程序的一部分,那么您将不得不以其他方式重定向。您可以使用维护页面在 IIS 中创建不同的站点。然后删除实时站点的绑定并将其添加到维护站点,同时进行工作。稍后再将其移回。

更新:这是我编写的一些 PowerShell,它将等待所有连接关闭。它只查看端口 443 和 80。您可能需要根据您的网站对其进行修改:

$TCPProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()

Do {
    $StillConnections = $FALSE
    $Connections = $TCPProperties.GetActiveTcpConnections()
    foreach ($Connection in $Connections) {
        if ($Connection.LocalEndPoint.Port -eq "443") {
            $StillConnections = $TRUE
            Break
        }
    }
    Start-Sleep -s 2
} While($StillConnections) 

Do {
    $StillConnections = $FALSE
    $Connections = $TCPProperties.GetActiveTcpConnections()
    foreach ($Connection in $Connections) {
        if ($Connection.LocalEndPoint.Port -eq "80") {
            $StillConnections = $TRUE
            Break
        }
    }
    Start-Sleep -s 2
} While($StillConnections) 

【讨论】:

  • 感谢您的回答。遗憾的是,我的同事(他实际上想要拥有此功能)不想使用这两种解决方案中的任何一种。
  • 任何其他解决方案很可能要复杂得多。
  • 如果你不停止应用程序池,大多数时候一些文件(例如,xyz.dll)仍然被一些进程使用,即使你放置了app_offline.html页面。因此,例如,如果您想为您的自动/复杂部署显示离线页面,此解决方案将无法正常工作。
  • @Zeeshan 你试过了吗?我上周刚刚使用它,并且能够在使用 app_offline.htm 的同时使用自动部署更新整个复杂的站点。文档确实说“它将关闭应用程序的应用程序域”。
  • @ChristosLytras 听起来可以。但总有可能在主站点关闭和维护站点启动之间出现请求。
【解决方案2】:

如果您停止网站,则意味着该网站不再侦听对其所有绑定的请求。这可以防止您在网站中的应用程序接收任何后续请求;与您网站的新连接将失败,就好像它不存在一样。

所以首先启动应用程序池并创建一个临时页面,用于重定向所有页面。

以下是 URL 重写规则,它将所有页面重定向到正在构建的页面。

<rule name="RequestBlockingRule1" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="{URL}" pattern=".*" />
                    <add input="{REQUEST_URI}" pattern="temp.html" negate="true" />
                </conditions>
                <action type="Redirect" url="temp.html" />
            </rule>

如果您想重定向到另一个站点,您可以在操作 URL 值中设置另一个站点 url。

【讨论】:

  • 感谢您的回答。但遗憾的是我不能使用你的方法,因为我的同事不想更改绑定。
  • 这不会改变绑定。
  • @GabrielLuci 说它不会更改绑定。您只需要添加页面并将所有请求重定向到正在构建的页面。这只是一个示例,我使用了我的站点绑定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2010-12-13
  • 2023-01-20
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
相关资源
最近更新 更多