主要思路
添加一个Attribute以及Filter类,在Filter中根据是否存在Attribute来判断是否跳到站点维护页。
代码实现
Attribute:
/// <summary>
/// 站点关闭时也可访问
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class RunWhenSitePausedAttribute : Attribute
{
}
Filter:
/// <summary>
/// 站点是否开启过滤器
/// </summary>
public class PauseSiteCheckFilter : IAuthorizationFilter, ITransientDependency
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.IsChildAction)
return;
//判断是否进入站点维护页
if (!isEnable)//获取后台设置,如果站点关闭则进入以下判断
{
var context = HttpContext.Current;
var methodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull();
var isDefined = CanRunWhenSitePaused(methodInfo);
if (!isDefined)
{
//跳转页面
var url = UrlHelper.GenerateUrl(null, "PausePage", "Home", new RouteValueDictionary { { "area", "" } },
RouteTable.Routes, context.Request.RequestContext, true);
filterContext.Result = new RedirectResult(url);
}
}
}
/// <summary>
/// 检查是否存在[RunWhenSitePaused]属性
/// </summary>
/// <param name="methodInfo"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
private bool CanRunWhenSitePaused(MethodInfo methodInfo, bool defaultValue = false)
{
if (methodInfo == null)
{
return false;
}
if (!methodInfo.IsPublic)
{
return false;
}
if (methodInfo.IsDefined(typeof(RunWhenSitePausedAttribute), true))
{
return true;
}
var classType = methodInfo.DeclaringType;
if (classType != null)
{
if (classType.IsDefined(typeof(RunWhenSitePausedAttribute), true))
{
return true;
}
}
return defaultValue;
}
}