ASP.Net Core 5.0 MVC中AOP思想的体现(五种过滤器)并结合项目案例说明过滤器的用法
2021-02-10 23:22
1571 查看
执行顺序
使用方法,首先实现各自的接口,override里面的方法, 然后在startup 类的 ConfigureServices 方法,注册它们。
services.AddTransient(typeof(MyAction)); services.AddTransient(typeof(MyResult)); services.AddTransient(typeof(MyException)); services.AddTransient(typeof(MyAuthorize)); services.AddTransient(typeof(MyResource)); services.AddTransient(typeof(CheckLogin));
下面我将代码贴出来,照着模仿就可以了
IActionFilter
public class MyAction :Attribute,IActionFilter { public void OnActionExecuted(ActionExecutedContext context) { var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; Console.WriteLine($"行为过滤器OnActionExecuted作用于{controllerName }控制器下的{actionName }方法运行之后</br>", Encoding.Default); } public void OnActionExecuting(ActionExecutingContext context) { var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; Console.WriteLine($"行为过滤器OnActionExecuting作用于{controllerName }控制器下的{actionName }方法运行之前</br>", Encoding.UTF8); } }
IResultFilter
public class MyResult : Attribute,IResultFilter { public void OnResultExecuted(ResultExecutedContext context) { var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; Console.WriteLine($"结果过滤器ResultExecuted作用于{controllerName }控制器下的{actionName }方法运行之后</br>", Encoding.Unicode); } public void OnResultExecuting(ResultExecutingContext context) { var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; Console.WriteLine($"结果过滤器OnResultExecuting作用于{controllerName }控制器下的{actionName }方法运行之前</br>", Encoding.ASCII); } 56c }
IExceptionFilter
public class MyException : Attribute,IExceptionFilter { public void OnException(ExceptionContext context) { ////调用框架本身异常处理器的方法 //base.OnException(filterContext); var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; ad8 //获取异常信息(可以根据实际需要写到本地或数据库中) var errorMsg = context.Exception.Message; Console.WriteLine($"异常过滤器OnException作用于{controllerName }控制器下的{actionName }方法发生了错误: {errorMsg}</br>"); //跳转指定的错误页面 context.ExceptionHandled = true; } }
IAuthorizationFilter
public class MyAuthorize : Attribute,IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; Console.WriteLine($"身份验证过滤器OnAuthorization作用于{controllerName }控制器下的{actionName }方法</br>"); } }
IResourceFilter
public class MyResource : Attribute, IResourceFilter { private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>(); public void OnResourceExecuted(ResourceExecutedContext context) { var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; //代码执行到这里,就表示一定完成了逻辑计算;就有结果; string key = context.HttpContext.Request.Path; CacheDictionary[key] = context.Result; Console.WriteLine($"资源过滤器OnResourceExecuted 在{controllerName }控制器下的{actionName }方法运行之后,将结果数据缓存起来</br>"); } public void OnResourceExecuting(ResourceExecutingContext context) { var controllerName = context.RouteData.Values["controller"]; var actionName = context.RouteData.Values["action"]; ///1.先判断缓存中是否有数据 ///2.如果有数据,就直接拿着数据走了 ///3.没有就继续往后,就去实例化控制器,去执行Action做计算 //缓存:需要一个key; 只要是key不变,拿到的数据就不变; //如果做缓存,一般请求路径不变,数据一般不变; string key = context.HttpContext.Request.Path; if (CacheDictionary.Any(item => item.Key == key)) { Console.WriteLine($"资源过滤器OnResultExecuting 在{controllerName }控制器下的{actionName }方法运行之前 判断有缓存数据,直接返回数据</br>"); context.Result = CacheDictionary[key] as IActionResult; } //如果没有缓存---就继续往后; Console.WriteLine($"资源过滤器OnResultExecuting 在{controllerName }控制器下的{actionName }方法运行之前 判断没有缓存数据</br>"); } }
效果验证
执行顺序
& ad8 nbsp;
发生异常时的顺序
IResourceFilter做数据缓存的效果
相关文章推荐
- 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法
- ASP.NET MVC 过滤器说明
- ASP.NET Core 2.0 MVC项目实战
- 主攻ASP.NET.4.5.1 MVC5.0之重生:Web项目语音朗读网页文本,简单语音提示浏览状态
- 主攻ASP.NET.4.5.1 MVC5.0之重生:空地搭建一个包含 Ninject框架 项目
- asp.net -mvc框架复习(2)-创建ASP.NET MVC 第一个程序以及MVC项目文件夹说明
- Asp.Net Mvc项目初始化说明
- ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
- 在ASP.NET MVC项目中使用RequireJS库的用法示例
- 主攻ASP.NET.4.5.1 MVC5.0之重生:创建UIHelper通用自定义分页和选择开关与PagesHelper和IsSelect简单用法
- ASP.NET MVC Bundles 用法和说明(打包javascript和css)
- ASP.NET MVC ActionFilter自定义过滤器异常过滤器过滤器用法
- 主攻ASP.NET.4.5.1 MVC5.0之重生:在项目中使用zTree jQuery 树插件
- ASP.NET MVC过滤器中权限过滤器ValidateAntiForgeryToken的用法(Post-Only)
- Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
- asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
- 一个基于标准的ASP.NET MVC2.0 + LINQ 的一个项目案例
- ASP.NET MVC Bundles 用法和说明(打包javascript和css)
- ASP.NET MVC过滤器中权限过滤器ValidateAntiForgeryToken的用法(Post-Only)
- ASP.NET MVC Bundles 用法和说明(打包javascript和css)