网站" Down for maintenance"最佳实践

时间:2015-09-03 02:04:13

标签: asp.net-mvc iis web-deployment maintenance

我有一个面向公众的网站(银行相关),将在未来几周内更新PROD。我需要显示一个" Down for maintenance"停电窗口期间的页面。因为银行已经为我提供了页面的特定要求,需要与网站本身完全相同,我不认为app_offline.htm解决方案对我有用,因为我无法访问我的样式表和图像,因为IIS将所有请求重定向到此页面。

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

更新

我实现了以下内容,它看起来效果很好。当我将Outage.htm或Maintenance.htm文件放入我的Web根文件夹时,它将相应地重定向。停电和定期维护具有不同的样式和内容,因此我必须创建2个页面。此外,在中断或维护模式下,请求来自localhost,然后不要重定向,以允许在进行维护后测试网站,同时阻止外部请求。

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);
    }
}

1 个答案:

答案 0 :(得分:4)

我实现了以下内容,它看起来效果很好。当我将Outage.htm或Maintenance.htm文件放入我的Web根文件夹时,它将相应地重定向。停电和定期维护具有不同的样式和内容,因此我必须创建2个页面。此外,在中断或维护模式下,请求来自localhost,然后不要重定向,以允许在进行维护后测试网站,同时阻止外部请求。

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);
    }
}