执行顺序
使用方法,首先实现各自的接口,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>\");}}
效果验证
执行顺序
&ad8nbsp;
发生异常时的顺序