我有一个面向公众的网站(银行相关),将在未来几周内更新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);
}
}
答案 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);
}
}