欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

asp.net core MVC 过滤器之ActionFilter过滤器(2)

时间:2021-04-22 09:09:17|栏目:.NET代码|点击:

本系类将会讲解asp.net core MVC中的内置过滤器的使用,将分为以下章节

  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执行之前和之后执行相应的方法。

实现一个自定义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>();
      });

上一篇:请求如何进入ASP.NET MVC框架

栏    目:.NET代码

下一篇:ASP.NET MVC中使用JavaScriptResult的用法示例

本文标题:asp.net core MVC 过滤器之ActionFilter过滤器(2)

本文地址:http://www.codeinn.net/misctech/106364.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有