执行顺序

使用方法,首先实现各自的接口,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); |
| |
| } |
| } |
IExceptionFilter
| public class MyException : Attribute,IExceptionFilter |
| { |
| public void OnException(ExceptionContext context) |
| { |
| |
| var actionName = context.RouteData.Values["action"]; |
| |
| 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"]; |
| |
| |
| |
| 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"]; |
| |
| |
| 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>"); |
| } |
| } |
效果验证
执行顺序


发生异常时的顺序


IResourceFilter做数据缓存的效果


原文地址:
https://www.cnblogs.com/for-easy-fast/p/14396996.html