起始
创建过滤器
using Microsoft.AspNetCore.Mvc.Filters;
namespace WebApplication3.Utility.Filter
{
public class CustomResourceFilter : Attribute, IResourceFilter
{
/// <summary>
/// 在xx资源之后
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuted(ResourceExecutedContext context)
{
Console.WriteLine("OnResourceExecuted");
}
/// <summary>
/// 在xx资源之前
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuting(ResourceExecutingContext context)
{
Console.WriteLine("OnResourceExecuting");
}
}
}
使用过滤器
using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;
namespace WebApplication3.Controllers
{
public class ThirdController : Controller
{
[CustomResourceFilter]
public IActionResult Index()
{
return View();
}
}
}
缓存数据_AsgncResourceFilter
修改过滤器
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace WebApplication3.Utility.Filter
{
public class CustomResourceFilter : Attribute, IResourceFilter
{
private static Dictionary<string,object> CacheDictionary = new Dictionary<string,object>();
/// <summary>
/// 在xx资源之后
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuted(ResourceExecutedContext context)
{
string key = context.HttpContext.Request.Path;
CacheDictionary[key] = context.Result;
Console.WriteLine("OnResourceExecuted");
}
/// <summary>
/// 在xx资源之前
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuting(ResourceExecutingContext context)
{
// 请求的路径
string key = context.HttpContext.Request.Path;
if (CacheDictionary.ContainsKey(key))
{
// 只要是给Result赋值,就会中断往后执行,直接返回给调用方
context.Result = (IActionResult)CacheDictionary[key];
}
Console.WriteLine("OnResourceExecuting");
}
}
}
修改Controller
using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;
namespace WebApplication3.Controllers
{
public class ThirdController : Controller
{
[CustomResourceFilter]
public IActionResult Index()
{
// 定义一个缓存的区域
// 判断是否有缓存
// 如果没有缓存,则计算
// 计算结果保存到缓存中
ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");
return View();
}
}
}
对应视图
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<h3>
来自于控制器的计算结果:@ViewBag.Date
</h3>
<h3>
来自于实际计算的结果:@DateTime.Now.ToString("yyyy-MM-dd ss");
</h3>
效果演示
第一次进入
第二次进入
第三次进入
异步缓存_AsgncResourceFilter
修改过滤器
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace WebApplication3.Utility.Filter
{
public class CustomAsyncResourceFilter : Attribute, IAsyncResourceFilter
{
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 当xxx资源执行的时候
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
Console.WriteLine("before");
String key = context.HttpContext.Request.Path;
if (CacheDictionary.ContainsKey(key))
{
// 只要是给Result赋值,就会中断往后执行,直接返回给调用方
context.Result = (IActionResult)CacheDictionary[key];
}
else
{
// 执行控制器的构造函数
ResourceExecutedContext resource = await next.Invoke();
CacheDictionary[key] = resource.Result;
}
Console.WriteLine("after");
}
}
}
修改controller
using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;
namespace WebApplication3.Controllers
{
public class ThirdController : Controller
{
[CustomResourceFilter]
public IActionResult Index()
{
// 定义一个缓存的区域
// 判断是否有缓存
// 如果没有缓存,则计算
// 计算结果保存到缓存中
ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");
return View();
}
[CustomAsyncResourceFilter]
public IActionResult Index1()
{
// 支持缓存
Console.WriteLine("index1 here");
ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");
return View();
}
}
}
日志记录_ActionFilter
特点
更靠近action,记录的就是Action执行前最后真实的参数和结果
配置filter
using Microsoft.AspNetCore.Mvc.Filters;
namespace WebApplication3.Utility.Filter
{
public class LogActionFilter : Attribute, IActionFilter
{
private readonly ILogger<LogActionFilter> logger;
public LogActionFilter(ILogger<LogActionFilter> logger)
{
this.logger = logger;
}
/// <summary>
/// 在xxx执行之后
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("after");
var result = Newtonsoft.Json.JsonConvert.SerializeObject(context.Result);
var name1 = context.HttpContext.GetRouteValue("controller");
var name2 = context.HttpContext.GetRouteValue("action");
logger.LogInformation($"执行:{name1},控制器:{name2},参数:{result}");
}
/// <summary>
/// 在xxx执行之前
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine("before");
var para = context.HttpContext.Request.QueryString.Value;
var name1 = context.HttpContext.GetRouteValue("controller");
var name2 = context.HttpContext.GetRouteValue("action");
logger.LogInformation($"执行:{name1},控制器:{name2},参数:{para}");
}
}
}
配置controller
using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;
namespace WebApplication3.Controllers
{
public class ThirdController : Controller
{
[TypeFilter(typeof(LogActionFilter))]
public IActionResult Index2(int id)
{
ViewBag.user = Newtonsoft.Json.JsonConvert.SerializeObject(new {
id = id,
name = " zhansan",
age = 66
});
ViewData["userinfo"] = Newtonsoft.Json.JsonConvert.SerializeObject(new
{
id = id,
name = " lisi",
age = 88
});
// 支持缓存
Console.WriteLine("index2 here");
return View();
}
}
}