网站“停机维护”最佳实践
Posted
技术标签:
【中文标题】网站“停机维护”最佳实践【英文标题】:Website "Down for maintenance" best practice 【发布时间】:2015-09-03 02:04:13 【问题描述】:我有一个面向公众的网站(与银行相关),该网站将在接下来的几周内进行 PROD 更新。我需要在停电窗口期间显示一个“Down for maintenance”页面。由于银行已经为我提供了该页面的具体要求,需要与网站本身的样式完全相同,我不认为 app_offline.htm 解决方案对我有用,因为我无法访问我的样式表和图像,因为 IIS 将所有请求重定向到此页面。
我想知道,最好的解决方案设计是什么,以便我可以在维护页面上使用我网站中的样式和图像?有人告诉我这样做的一个好方法是创建一个新网站,包括样式和图像,并将其部署为 IIS
更新:
我实现了以下,它似乎工作得很好。当我将 Outage.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);
【问题讨论】:
您如何部署您的应用程序?您是否关心部署期间的当前会话状态/用户?您的部署需要多长时间?此外,您应该能够在 app_offline.htm 页面中加载 CSS。 我不关心会话等...网站的所有流量都会在离线之前被阻止。 【参考方案1】:我实现了以下,它似乎工作得很好。当我将 Outage.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);
【讨论】:
嗨,当您发布新版本的 Web 应用程序时,这是否有效?这会自动发生吗?以上是关于网站“停机维护”最佳实践的主要内容,如果未能解决你的问题,请参考以下文章