.net core 继承ActionFilterAttribute 实现自定义过滤器

1 自定义特性

using System;

namespace WebApplication_MVC
{
    public class AcCodeAttribueClass : Attribute
    {
        public string Code { get; set; }
        public string Msg { get; set; }

        public AcCodeAttribueClass(string code,string msg)
        {
            Code = code;
            Msg = msg;
        }
    }
}

 

2 自定义过滤器

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Reflection;

namespace WebApplication_MVC
{
    public class MyActionFilter : ActionFilterAttribute
    {
        /// <summary>
        /// 当Action执行完后执行
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
        }

        /// <summary>
        /// 在Action执行前执行
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);

            var controller = context.Controller;
            var acCodeAttribueClass = controller.GetType().GetMethod("Index").GetCustomAttribute<AcCodeAttribueClass>();

            // 校验不通过
            if (acCodeAttribueClass?.Code != null)
            {
                var res = "无权访问";

                context.HttpContext.Response.WriteAsync(res);

                // 将Result设置为非空值使过滤器管道短路,会阻止管道的其余部分执行
                context.Result = new JsonResult(res);
            }
        }
    }
}

3 在 controller 中的 action 指定特性

    public class LoginController : Controller
    {
        [AcCodeAttribueClass("Login","登录")]
        /// <summary>
        /// 登录页面
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            return View();
        }

4 在 Startup.cs 注册过滤器

.net core 继承ActionFilterAttribute 实现自定义过滤器

 

 5 测试

.net core 继承ActionFilterAttribute 实现自定义过滤器

6 注意事项

执行流程:

(1) 当在 MyActionFilter  中的 OnActionExecuting 设置了 ActionExecutingContext.Result 值为非空时,这使过滤器管道短路,会阻止管道的其余部分执行;即程序执行流程如下:

MyActionFilter.OnActionExecuting  -->  服务器返回响应

(2) 当未设置ActionExecutingContext.Result值时执行流程如下:

MyActionFilter.OnActionExecuting --> LoginController.Index -->MyActionFilter.OnActionExecuted  -->  服务器返回响应

.net core 继承ActionFilterAttribute 实现自定义过滤器

上一篇:构建http,打开网址


下一篇:Apache Flink 介绍