本文摘自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实现生成缩略图及加水印的方法示例
asp.net实现文件下载功能
asp.net完成文件上传的代码教程
core web中使用appsettings.json配置文件的实例详解(asp.net )
asp.net实现省市二级联动功能的实例代码
asp.net性能监控及其优化入门
详解asp.net使用ajax实现分页局部刷新页面功能的代码实例
asp.net在网站根目录下创建文件夹
asp.net core实例详解一
asp.net mvc 中关于路径这个问题
更多相关阅读请进入《ActionFilter》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » asp.net之ActionFilter过滤器