asp.net core MVC 过滤器之 ExceptionFilter 过滤器(一)
asp.net core MVC 过滤器之 ActionFilter 过滤器(二)
asp.net core MVC 过滤器之 ResultFilter 过滤器(三)
asp.net core MVC 过滤器之 ResourceFilter 过滤器(四)
asp.net core MVC 过滤器之 AuthorizationFilter 过滤器(五)
Action 过滤器将在 controller 的 Action 执行之前和之后执行相应的方法。
自定义一个全局异常过滤器需要实现 IActionFilter 接口
- public class ActionFilter : IActionFilter
- {
- public void OnActionExecuted(ActionExecutedContext context)
- {
- Console.WriteLine("action执行之后");
- }
- public void OnActionExecuting(ActionExecutingContext context)
- {
- Console.WriteLine("action执行之前");
- }
- }
IActionFilter 需要实现两个方法 OnActionExecuted,OnActionExecuting。OnActionExecuting 将在 Action 之前执行,OnActionExecuted 在 Action 之后执行。
知道原理之后我们们就可以利用其特性来简化我们的代码,在 MVC 中一个重要的概念就时 Model 验证,我们定义 Model 约束,然后在 Action 中验证 Model 是否绑定成功,我们的 Action 中重复地写如下代码
- [HttpGet]
- public ActionResult Get()
- {
- if (!ModelState.IsValid) return BadRequest("参数错误!");
- }
这样重复的代码不仅增加代码复杂都也不美观,我们可以在 ActionFilter 中自动完成
- public void OnActionExecuting(ActionExecutingContext context)
- {
- if (context.ModelState.IsValid) return;
- var modelState = context.ModelState.FirstOrDefault(f => f.Value.Errors.Any());
- string errorMsg = modelState.Value.Errors.First().ErrorMessage;
- throw new AppException(errorMsg);
- }
当 Model 绑定错误时,我们抛出异常信息,并在上一章节的异常过滤器 ExceptionFilter 中捕获,返回错误信息给请求方。
我们也可以利用 ActionFilter 的特性来记录 Action 的执行时间,当 Action 执行时间过慢时输出警告日志
- public class ActionFilter : IActionFilter
- {
- public void OnActionExecuted(ActionExecutedContext context)
- {
- var httpContext = context.HttpContext;
- var stopwach = httpContext.Items[Resources.StopwachKey] as Stopwatch;
- stopwach.Stop();
- var time = stopwach.Elapsed;
- if (time.TotalSeconds > 5)
- {
- var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
- var logger = factory.CreateLogger<ActionExecutedContext>();
- logger.LogWarning($"{context.ActionDescriptor.DisplayName}执行耗时:{time.ToString()}");
- }
- }
- public void OnActionExecuting(ActionExecutingContext context)
- {
- var stopwach = new Stopwatch();
- stopwach.Start();
- context.HttpContext.Items.Add(Resources.StopwachKey, stopwach);
- }
- }
上面的代码利用使用 HttpContext 传递一个 Stopwach 来计算 action 的执行时间,并在超过 5 秒时输出警告日志。
注册方法与 ExceptionFinter 相同。找到系统根目录 Startup.cs 文件,修改 ConfigureServices 方法如下
- services.AddMvc(options =>
- {
- options.Filters.Add<ActionFilter>();
- });
来源: http://www.cnblogs.com/huanent/p/7421220.html