IResourceFilter、IAsyncResourceFilter两个Filter主要使用场景为数据缓存,如Redis缓存、内存缓存。下面通过实例分别进行讲解。
缓存程序编写思路:
1、定义一个缓存的区域
2、请求来了,根据缓存的标识---判断缓存是否存在,如果有缓存,就返回缓存的值
3、如果没有缓存---做计算
4、计算结果保存到缓存中去新建一个类ResourceFilterAttribute继承自Attribute类和 IResourceFilter接口,并且实现IResourceFilter方法,代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; namespace NetCoreStudy.WebApi.Utility.Filters { public class ResourceFilterAttribute : Attribute, IResourceFilter { private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>(); /// <summary> /// 在XX资源之前 /// </summary> /// <param name="context"></param> public void OnResourceExecuting(ResourceExecutingContext context) { string key = context.HttpContext.Request.Path; if (CacheDictionary.ContainsKey(key)) { //只要给Reslut赋值了,就会中断往后执行,直接返回给调用方 context.Result = (IActionResult)CacheDictionary[key]; } Console.WriteLine("在某某资源之前执行"); } /// <summary> /// 在XX资源之后 /// </summary> /// <param name="context"></param> public void OnResourceExecuted(ResourceExecutedContext context) { //拿到执行结果,保存到缓存 string key = context.HttpContext.Request.Path; CacheDictionary[key] = context.Result; Console.WriteLine("在某某资源之后执行"); } } }
以上是IResourceFilter用于缓存的实例代码。使用方法需在Action方法上增加[ResourceFilter]特性即可。代码如下:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NetCoreStaty.BussinessInterface; using NetCoreStudy.Model; using NetCoreStudy.Utility; using NetCoreStudy.WebApi.Utility.Filters; namespace NetCoreStudy.WebApi.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class FilterController : ControllerBase { private readonly IBookService _bookService; public FilterController(IBookService bookService) { _bookService = bookService; } [HttpGet] [ResourceFilter] public IActionResult Index() { var list = _bookService.Query<BookEntity>(c => true).ToList(); return new JsonResult(new ApiDataResult<List<BookEntity>>() { Success = true, Data = list, Message = "图书列表" }); } } }
如访问Index方法,首次访问的代码执行顺序为,先执行Filter的OnResourceExecuting方法,执行完执行控制器的构造方法,构造方法方法执行完执行Index方法,执行完Index方法再执行Filter的OnResourceExecuted方法(将执行结果写入缓存)。之后在访问Index方法的执行顺序是代码只执行Filter的OnResourceExecuting方法就直接返回了(直接将缓存中的数据返回了),后面代码不在执行了。
新建一个类AsyncResourceFilterAttribute继承自Attribute类和 IAsyncResourceFilter接口,并且实现IAsyncResourceFilter方法,代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; namespace NetCoreStudy.WebApi.Utility.Filters { public class AsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter { private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>(); /// <summary> /// 当XX资源执行的时候调用 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next) { #region 控制器构造方法及访问的方法执行之前执行的代码 Console.Write("控制器构造方法及访问的方法执行之前执行的代码"); string key = context.HttpContext.Request.Path; if (CacheDictionary.ContainsKey(key)) { context.Result = (IActionResult)CacheDictionary[key]; } #endregion else { ResourceExecutedContext resource = await next.Invoke();//本行代码去执行执行控制器构造方法及访问的方法 #region 控制器构造方法及访问的方法执行之后执行的代码 Console.Write("控制器构造方法及访问的方法执行之后执行的代码"); CacheDictionary[key] = resource.Result; #endregion } } } }
以上是IAsyncResourceFilter用于缓存的实例代码。使用方法需在Action方法上增加[AsyncResourceFilter]特性即可。代码如下:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NetCoreStaty.BussinessInterface; using NetCoreStudy.Model; using NetCoreStudy.Utility; using NetCoreStudy.WebApi.Utility.Filters; namespace NetCoreStudy.WebApi.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class FilterController : ControllerBase { private readonly IBookService _bookService; public FilterController(IBookService bookService) { _bookService = bookService; } [HttpGet] [AsyncResourceFilter] public IActionResult AsyncIndex() { var list = _bookService.Query<BookEntity>(c => true).ToList(); return new JsonResult(new ApiDataResult<List<BookEntity>>() { Success = true, Data = list, Message = "图书列表" }); } } }
如访问AsyncIndex方法,首次访问的代码执行顺序为,先执行Filter的如下代码
#region 控制器构造方法及访问的方法执行之前执行的代码 Console.Write("控制器构造方法及访问的方法执行之前执行的代码"); string key = context.HttpContext.Request.Path; if (CacheDictionary.ContainsKey(key)) { context.Result = (IActionResult)CacheDictionary[key]; } #endregion
执行完以上代码再执行“ResourceExecutedContext resource = await next.Invoke();”这句代码,执行完再执行控制器的构造方法,构造方法方法执行完执行Index方法,执行完Index方法再执行
#region 控制器构造方法及访问的方法执行之后执行的代码 Console.Write("控制器构造方法及访问的方法执行之后执行的代码"); CacheDictionary[key] = resource.Result; #endregion
代码将执行结果写入缓存。之后再访问Index方法的执行顺序是代码只执行
#region 控制器构造方法及访问的方法执行之前执行的代码 Console.Write("控制器构造方法及访问的方法执行之前执行的代码"); string key = context.HttpContext.Request.Path; if (CacheDictionary.ContainsKey(key)) { context.Result = (IActionResult)CacheDictionary[key]; } #endregion
代码就直接返回了(直接将缓存中的数据返回了),后面代码不在执行了。
以上记录了IResourceFilter、IAsyncResourceFilter使用方法,方便后期项目开发学习使用。
- .net core webapi教程-Swagger请求参数设置默认值(1686)
- .net core webapi教程-设置返回Json格式与Model大小写一致(1157)
- .net core webapi教程-设置日期型字段返回Json格式(1121)
- .net core webapi教程-IActionFilter使用详解 (1076)
- .net core webapi教程-配置 Swagger 显示接口注释及描述信息(1056)
- .net core webapi教程-Swagger请求参数通过属性特性设置默认值(922)
- .net core webapi教程-Filter全局注册、控制器注册如何排除某些Action方法使其不生效(857)
- .net core webapi教程-IExceptionFilter、IAsyncExceptionFilter使用详解 (842)
- .net core webapi教程-使用log4net写文本日志(772)
- .net core webapi教程-使用log4net写sqlserver数据库日志 (702)
- 1. Windows Server 2008 R2永久激活及Chew-WGA v0.9下载(12740)
- 2.Visual Studio 2017中安装visualSVN及使用详解(4861)
- 3.完美解决iis下JWplayer提示Error loading media: File could not be played错误(3756)
- 4.asp.net mvc+jquery easyui开发基础(一)模块首页及增加、修改、删除模块实现(2978)
- 5.Android avax.net.ssl.SSLPeerUnverifiedException: No peer certificate 解决方法(httpClient支持HTTPS的访问方式)(2828)
- 6..Net Mvc中使用Jquery EasyUI控件讲解(一)表格控件datagrid使用介绍(2689)
- 7.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(三)登录模块开发(2592)
- 8.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(七)权限管理模块之系统菜单动态生成(2559)
- 9. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(六)权限管理模块之初始数据准备(2207)
- 10.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(八)权限管理模块之权限管理实现(2175)