asp.net之ActionFilter过滤器


本文摘自PHP中文网,作者巴扎黑,侵删。

这篇文章主要为大家详细介绍了asp.net core MVC 过滤器之ActionFilter过滤器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本系类将会讲解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接口


1

2

3

4

5

6

7

8

9

10

11

12

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中重复地写如下代码


1

2

3

4

5

[HttpGet]

public ActionResult Get()

{

  if (!ModelState.IsValid) return BadRequest("参数错误!");

}

这样重复的代码不仅增加代码复杂都也不美观,我们可以在ActionFilter中自动完成


1

2

3

4

5

6

7

8

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执行时间过慢时输出警告日志


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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方法如下


1

2

3

4

services.AddMvc(options =>

      {

        options.Filters.Add<ActionFilter>();

      });

以上就是asp.net之ActionFilter过滤器的详细内容!

相关阅读 >>

解决 asp.net core mysql varchar 字符串截取实例教程

asp.net webapi中 filter的使用以及执行顺序(收藏)

解析asp.net页面传值的方法技巧

详解.net完成configuration读取配置的实例详解

asp.net core类库项目中如何实现读取配置文件的详解

[asp.net mvc 小牛之路]08 - area 使用

画图形验证码的asp代码实例

.net mvc从视图传参到控制器的3种形式

asp.net core应用程序运行vue并且部署在iis上的详解

asp.net core程序发布到linux生产环境详解

更多相关阅读请进入《ActionFilter》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...