我刚刚进入一个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" }
});
}
}
我该怎么做我想做的事?这是最好的方法吗? 另外:当网站不时,如何阻止用户访问此页面?谢谢!
答案 0 :(得分:0)
您当前的方法很脆弱,因为它不适合路由。路由可以将控制器/方法名称与用于访问它们的URL分离,因此,如果您熟练使用路由,这种方法将失败。
我会普遍应用DownForMaintenanceActionFilter
(顺便说一句,惯例说它实际上应该命名为DownForMaintenanceActionFilterAttribute
),然后创建第二个Attribute
(类似于IgnoreDownForMaintenanceAttribute
实现),使用属性标记您的Offline
控制器/方法,并确保DownForMaintenanceActionFilter
检查其存在并采取相应的行动。
看看filterContext.ActionDescriptor
property。 IIRC,您需要的大部分信息都已经为您收集。
提供有关操作方法的信息,例如其名称,控制器,参数,属性和过滤器。
无关:如果我正在创建一个普遍适用的ActionFilter
,我会非常小心在每个请求上按下数据库。可能值得在一段时间内缓存一个值,以便不那么频繁地连接到数据库。