services.AddMvc(o =>
{
o.Filters.Add(typeof(CustomGlobalActionFilterAttribute));// 这里就是全局注册Filter
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
全局OnActionExecuting===》控制器的OnActionExecuting====》Action的OnActionExecuting====》执行Action ====》Action的OnActionExecuted====》控制器的OnActionExecuted====》全局的OnActionExecuted。类似于一个俄罗斯套娃,也可以说是一个洋葱模型。
/// <summary>
/// 自定义的资源Filter
/// </summary>
public class CustomResourceFilterAttribute : Attribute, IResourceFilter
{
private static readonly Dictionary<string, object> _Cache = new Dictionary<string, object>();
private string _cacheKey;
/// <summary>
/// 控制器实例化之前
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
_cacheKey = context.HttpContext.Request.Path.ToString();
if (_Cache.ContainsKey(_cacheKey))
{
var cachedValue = _Cache[_cacheKey] as ViewResult;
if (cachedValue != null)
{
context.Result = cachedValue;
}
}
}
/// <summary>
/// 把请求都处理完的
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
if (!String.IsNullOrEmpty(_cacheKey) &&
!_Cache.ContainsKey(_cacheKey))
{
var result = context.Result as ViewResult;
if (result != null)
{
_Cache.Add(_cacheKey, result);
}
}
}
}