网站 "Down for maintenance" 最佳做法

Website "Down for maintenance" best practice

我有一个面向 public 的网站(银行相关),该网站将在接下来的几周内进行 PROD 更新。我需要在中断期间显示一个 "Down for maintenance" 页面 window.Because 银行给我提供了页面的具体要求,需要与网站本身的样式完全相同,我认为 app_offline.htm 解决方案对我有用,因为我无法访问我的样式表和图像,因为 IIS 将所有请求重定向到此页面。

我想知道什么是最好的解决方案设计,以便我可以在我的维护页面上使用我网站中的样式和图像?有人告诉我这样做的一个好方法是创建一个新网站,包括样式和图像,并将其作为单独的网站部署在 IIS< 然后在中断期间 window 我切换 IP 地址绑定IIS 指向我的维护站点。维护完成后,我将其切换回指向主网站。这是解决问题的好方法吗?

更新:

我实现了以下,它似乎工作得很好。当我将 Outage.htm 或 Maintenance.htm 文件放入我的网络根文件夹时,它会相应地重定向。停机和定期维护具有不同的样式和内容,因此我不得不创建 2 个页面。此外,当处于中断或维护模式时,并且请求来自本地主机,则不要重定向,以允许在阻止外部请求的同时进行维护后测试网站。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CheckForDownPage());
    }
}

   public sealed class CheckForDownPage : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string ipAddress = HttpContext.Current.Request.UserHostAddress;

        var outagePage = System.Web.Hosting.HostingEnvironment.MapPath("~/Outage.htm");
        var maintenancePage = System.Web.Hosting.HostingEnvironment.MapPath("~/Maintenance.htm");

        var isOutage = System.IO.File.Exists(outagePage);
        var isMaintenance = System.IO.File.Exists(maintenancePage);            

        if ( (isOutage || isMaintenance) && ipAddress != "::1")
        {
            filterContext.HttpContext.Response.Clear();                
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
            filterContext.HttpContext.Response.StatusDescription = "Service Unavailable.";

            filterContext.HttpContext.Response.WriteFile(isOutage ? outagePage : maintenancePage);

            filterContext.HttpContext.Response.End();
            return;
        }

        base.OnActionExecuting(filterContext);
    }
}

我实现了以下,它似乎工作得很好。当我将 Outage.htm 或 Maintenance.htm 文件放入我的网络根文件夹时,它会相应地重定向。停机和定期维护具有不同的样式和内容,因此我不得不创建 2 个页面。此外,当处于中断或维护模式时,并且请求来自本地主机,则不要重定向,以允许在阻止外部请求的同时进行维护后测试网站。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CheckForDownPage());
    }
}

   public sealed class CheckForDownPage : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string ipAddress = HttpContext.Current.Request.UserHostAddress;

        var outagePage = System.Web.Hosting.HostingEnvironment.MapPath("~/Outage.htm");
        var maintenancePage = System.Web.Hosting.HostingEnvironment.MapPath("~/Maintenance.htm");

        var isOutage = System.IO.File.Exists(outagePage);
        var isMaintenance = System.IO.File.Exists(maintenancePage);            

        if ( (isOutage || isMaintenance) && ipAddress != "::1")
        {
            filterContext.HttpContext.Response.Clear();                
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
            filterContext.HttpContext.Response.StatusDescription = "Service Unavailable.";

            filterContext.HttpContext.Response.WriteFile(isOutage ? outagePage : maintenancePage);

            filterContext.HttpContext.Response.End();
            return;
        }

        base.OnActionExecuting(filterContext);
    }
}