2016-09-15 76 views
0

我刚刚被抛到ASP.NET MVC项目上,任务是创建一个“离线”页面,只要数据库中的标志设置为true就会显示出来。我检查了这个值,如果它是真的,我希望整个网站对于任何请求都是离线的。我做了一个ActionFilter到最后并将其添加到所有请求中。然后,当请求页面时,我会相应地进行过滤。但是,这也会过滤离线页面本身,因此我做了一行检查以查看它是否为离线页面 - 如果是,它只是返回。问题是登录页面正在如此转发:/ Account/Login?ReturnUrl =%2FOffline,最终显示登录页面。我该如何解决这个问题?ASP.NET MVC“离线”页面

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

是不是一个更好的approuch,使一个批处理文件,添加或删除一个app_offline.htm到网站 – lordkain

+0

我不得不使它自动为客户谁不知道这样的事情。 – skaz

回答

0

您目前的方法很脆弱,因为它不能很好地处理路由。路由可以将控制器/方法名称从用于访问它们的URL中分离出来,因此,如果您在路上行走时很聪明,则此方法将失败。

我会申请的DownForMaintenanceActionFilter(顺便说一句,约定说,它实际上应该被命名为DownForMaintenanceActionFilterAttribute)普遍,然后创建一个第二Attribute(像IgnoreDownForMaintenanceAttribute以最小的实现),标记你Offline控制器/法属性,并确保DownForMaintenanceActionFilter检查其存在并相应地进行操作。

看看filterContext.ActionDescriptor property。 IIRC,你需要的大部分信息将会为你收集。

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

无关:如果我创建了一个普遍适用的ActionFilter,我会非常小心地按照每个请求打开数据库。可能值得缓存一段时间的值,所以你不太经常连接到数据库。