ASP.NET MVC"离线"页

时间:2016-09-15 10:47:02

标签: c# asp.net asp.net-mvc redirect

我刚刚进入一个ASP.NET MVC项目,并负责制作一个"离线"每当数据库中的标志设置为true时显示的页面。我检查了值,如果是,我希望整个站点对任何请求都是脱机的。我最后制作了一个ActionFilter并将其添加到所有请求中。然后,当请求页面时,我相应地过滤。但是,这也过滤了脱机页面本身,所以我做了一行检查它是否是脱机页面 - 如果是,它只是返回。问题是登录页面是这样转发:/ Account / Login?ReturnUrl =%2FOffline,最终显示登录页面。我该如何解决这个问题?

public class DownForMaintenanceActionFilter : ActionFilterAttribute, IActionFilter
    {
        public DownForMaintenanceActionFilter()
        {
        }

        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
        {
            // If they are actually visiting the Offline page already, abort.
            if (HttpContext.Current.Request.RawUrl.Contains("Offline"))
            {
                this.OnActionExecuting(filterContext);
                return;
            }

            // We want to go to the "Down For Maintenance" Page if any of the following is true:
            bool siteIsUp = true;

            // Some other code here that sets siteIsUp = false

            if (!siteIsUp)
                RedirectToMaintenancePage(filterContext);
            else
                this.OnActionExecuting(filterContext);
        }


        private void RedirectToMaintenancePage(ActionExecutingContext filterContext)
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary 
                { 
                    { "controller", "Offline" }, 
                    { "action", "Index" } 
                });
        }
    }

我该怎么做我想做的事?这是最好的方法吗? 另外:当网站时,如何阻止用户访问此页面?谢谢!

1 个答案:

答案 0 :(得分:0)

您当前的方法很脆弱,因为它不适合路由。路由可以将控制器/方法名称与用于访问它们的URL分离,因此,如果您熟练使用路由,这种方法将失败。

我会普遍应用DownForMaintenanceActionFilter(顺便说一句,惯例说它实际上应该命名为DownForMaintenanceActionFilterAttribute),然后创建第二个Attribute(类似于IgnoreDownForMaintenanceAttribute实现),使用属性标记您的Offline控制器/方法,并确保DownForMaintenanceActionFilter检查其存在并采取相应的行动。

看看filterContext.ActionDescriptor property。 IIRC,您需要的大部分信息都已经为您收集。

  

提供有关操作方法的信息,例如其名称,控制器,参数,属性和过滤器。

无关:如果我正在创建一个普遍适用的ActionFilter,我会非常小心在每个请求上按下数据库。可能值得在一段时间内缓存一个值,以便不那么频繁地连接到数据库。