简介

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>();});

相关文章:

  • .NET Core 2.0 正式发布信息汇总

  • .NET Standard 2.0 特性介绍和使用指南

  • .NET Core 2.0 的dll实时更新、https、依赖包变更问题及解决

  • .NET Core 2.0 特性介绍和使用指南

  • Entity Framework Core 2.0 新特性

  • 体验 PHP under .NET Core

  • .NET Core 2.0使用NLog

  • 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

  • 解决Visual Studio For Mac Restore失败的问题

  • ASP.NET Core 2.0 特性介绍和使用指南

  • .Net Core下通过Proxy 模式 使用 WCF

  • .NET Core 2.0 开源Office组件 NPOI

  • ASP.NET Core Razor页面 vs MVC

  • Razor Page–Asp.Net Core 2.0新功能  Razor Page介绍

  • MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

  • .NET Core 2.0迁移技巧之web.config配置文件

  • asp.net core MVC 过滤器之ExceptionFilter过滤器(一)

  • ASP.NET Core 使用Cookie验证身份

原文地址:http://www.cnblogs.com/huanent/p/7421220.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

asp.net core MVC 过滤器之ActionFilter过滤器(二)相关推荐

  1. asp.net core MVC 过滤器之ExceptionFilter过滤器(一)

    简介 异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器.用于在系统出现未捕获异常时的处理. 实现一个自定义异常过滤器 自定义一个异常过滤器需要实现IExceptionFilter接口 publ ...

  2. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

  3. 你所不知道的ASP.NET Core MVC/WebApi基础系列(二)

    前言 好久没冒泡了,算起来估计有快半年没更新博客了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃,技术所淘汰,好吧,进 ...

  4. c#mvc过滤器之系统过滤器

    系统过滤器ActionName过滤器 [ActionName("Test")] 替换第一个视图为Test 在使用原视图会找不到路径相当于Index视图被覆盖了. 把路径改为Test ...

  5. ASP.NET Core MVC I\/O编程模型

    1.1. I/O编程模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-bloc ...

  6. ASP.NET Core MVC – Tag Helper 组件

    ASP.NET Core Tag Helpers系列目录,这是第五篇,共五篇: ASP.NET Core MVC – Tag Helpers 介绍 ASP.NET Core MVC – Caching ...

  7. 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级

    标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...

  8. 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装

    标题:从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11343141. ...

  9. 从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 如何启用预编译视图

    标题:从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 升级.NET 5及启用预编译视图 作者:Lamond Lu 地址:https://www.cnblogs.com/lwql ...

最新文章

  1. 给GridView中的buttonField添加一个删除确认功能
  2. SAP 大中华区第一季度业绩再创历史新高
  3. 回顾 | 进击吧! Blazor!系列
  4. 2043. 简易银行系统
  5. ASP.NET MVC2 使用绑定时 等号和冒号的差别 %=%和%:%的区别
  6. 国际版Azure搭建Windows多种类型***_一.简介及安装服务
  7. CCF-CSP认证历年真题详解
  8. LINUX 循环fork()
  9. syslog收到的日志存放在哪里_Linux使用RsyslogServer记录远程主机系统日志
  10. 论文笔记_S2D.74_2021_ICRA_PENet:面向精确和高效的图像引导的深度补全
  11. linux 脚本 格式化,Shell脚本批量格式化文件名
  12. VSCode调试JavaScript代码方法
  13. html表格行的悬停事件,jQuery实现HTML表格隔行变色及鼠标悬停变色效果
  14. Excel小技巧分享-自动缩放的表格来了
  15. 你认为996是一种荣耀吗?
  16. JavaScript执行机制(彻底弄懂宏任务微任务)
  17. 钉钉、企业微信平台发送工资条程序--燕春科技工资条管理系统2.0
  18. js如何实现侧边广告_如何用稳定器轻松实现低成本的商业级广告片制作?
  19. Theano官方文档的测试和总结(1):安装、基础语法、逻辑斯蒂回归
  20. motan学习笔记 五 opentracing学习入门

热门文章

  1. 【转】《从入门到精通云服务器》第六讲—OpenStack基础
  2. thinkphp 3.2 unionall
  3. 也来谈谈这致命的手机充电器
  4. aswing学习笔记3-在JPanel中,如何将.png格式的图片设置为背景?
  5. ICE专题:ICE简介
  6. 企业形象广告的几个突破要点
  7. 阿里分布式中间件Seata从入门到精通
  8. 如何在不安装 Microsoft Office 的情况下生成 Excel 文件?
  9. 巧用Newtonsoft.Json处理重复请求/并发请求?
  10. 从内存中释放Selenium chromedriver.exe