asp.net core MVC 过滤器之ActionFilter过滤器(2)
本系类将会讲解asp.netcoreMVC中的内置过滤器的使用,将分为以下章节
asp.netcoreMVC过滤器之ExceptionFilter过滤器(一)
asp.netcoreMVC过滤器之ActionFilter过滤器(二)
asp.netcoreMVC过滤器之ResultFilter过滤器(三)
asp.netcoreMVC过滤器之ResourceFilter过滤器(四)
asp.netcoreMVC过滤器之AuthorizationFilter过滤器(五)
简介
Action过滤器将在controller的Action执行之前和之后执行相应的方法。
实现一个自定义Action过滤器
自定义一个全局异常过滤器需要实现IActionFilter接口
publicclassActionFilter:IActionFilter
{
publicvoidOnActionExecuted(ActionExecutedContextcontext)
{
Console.WriteLine("action执行之后");
}
publicvoidOnActionExecuting(ActionExecutingContextcontext)
{
Console.WriteLine("action执行之前");
}
}
IActionFilter需要实现两个方法OnActionExecuted,OnActionExecuting。OnActionExecuting将在Action之前执行,OnActionExecuted在Action之后执行。
知道原理之后我们们就可以利用其特性来简化我们的代码,在MVC中一个重要的概念就时Model验证,我们定义Model约束,然后在Action中验证Model是否绑定成功,我们的Action中重复地写如下代码
[HttpGet]
publicActionResultGet()
{
if(!ModelState.IsValid)returnBadRequest("参数错误!");
}
这样重复的代码不仅增加代码复杂都也不美观,我们可以在ActionFilter中自动完成
publicvoidOnActionExecuting(ActionExecutingContextcontext)
{
if(context.ModelState.IsValid)return;
varmodelState=context.ModelState.FirstOrDefault(f=>f.Value.Errors.Any());
stringerrorMsg=modelState.Value.Errors.First().ErrorMessage;
thrownewAppException(errorMsg);
}
当Model绑定错误时,我们抛出异常信息,并在上一章节的异常过滤器ExceptionFilter中捕获,返回错误信息给请求方。
我们也可以利用ActionFilter的特性来记录Action的执行时间,当Action执行时间过慢时输出警告日志
publicclassActionFilter:IActionFilter
{
publicvoidOnActionExecuted(ActionExecutedContextcontext)
{
varhttpContext=context.HttpContext;
varstopwach=httpContext.Items[Resources.StopwachKey]asStopwatch;
stopwach.Stop();
vartime=stopwach.Elapsed;
if(time.TotalSeconds>5)
{
varfactory=context.HttpContext.RequestServices.GetService();
varlogger=factory.CreateLogger();
logger.LogWarning($"{context.ActionDescriptor.DisplayName}执行耗时:{time.ToString()}");
}
}
publicvoidOnActionExecuting(ActionExecutingContextcontext)
{
varstopwach=newStopwatch();
stopwach.Start();
context.HttpContext.Items.Add(Resources.StopwachKey,stopwach);
}
}
上面的代码利用使用HttpContext传递一个Stopwach来计算action的执行时间,并在超过5秒时输出警告日志。
注册全局过滤器
注册方法与ExceptionFinter相同。找到系统根目录Startup.cs文件,修改ConfigureServices方法如下
services.AddMvc(options=>
{
options.Filters.Add();
});
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。