Asp.net mvc 网站「;“停机维修”;最佳做法

Asp.net mvc 网站「;“停机维修”;最佳做法,asp.net-mvc,iis,web-deployment,maintenance,Asp.net Mvc,Iis,Web Deployment,Maintenance,我有一个面向公众的网站(与银行相关),它将在未来几周进行产品更新。我需要在停机窗口期间显示一个“停机维护”页面。因为银行向我提供了该页面的具体要求,该页面的样式需要与网站本身完全相同,我认为app_offline.htm解决方案对我不起作用,因为我无法访问我的样式表和图像,因为IIS将所有请求重定向到此页面 我想知道,什么是最好的解决方案设计,以便我可以利用我的网站在我的维护页面上的样式和图像?我被告知,一个好方法是创建一个新网站,包括样式和图像,并在IIS中作为单独的网站部署,然后在停机窗口期

我有一个面向公众的网站(与银行相关),它将在未来几周进行产品更新。我需要在停机窗口期间显示一个“停机维护”页面。因为银行向我提供了该页面的具体要求,该页面的样式需要与网站本身完全相同,我认为app_offline.htm解决方案对我不起作用,因为我无法访问我的样式表和图像,因为IIS将所有请求重定向到此页面

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

更新:


我实现了以下内容,它似乎工作得很好。当我将output.htm或Maintenance.htm文件放入我的web根文件夹时,它将相应地重定向。大修和定期维护有不同的样式和内容,所以我必须创建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);
    }
}
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);
    }
}

我实现了以下内容,它似乎工作得很好。当我将output.htm或Maintenance.htm文件放入我的web根文件夹时,它将相应地重定向。大修和定期维护有不同的样式和内容,所以我必须创建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);
    }
}
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);
    }
}

你是如何部署你的应用程序的?您是否关心部署期间的当前会话状态/用户?部署需要多长时间?另外,你应该能够在你的app_offline.htm页面中加载css。我不关心会话等。。。在脱机之前,网站的所有流量都将被阻止。您好,这在您发布新版本的web应用程序时有效吗?这是自动发生的吗?