ASP.Net Core 3.1 AOP Filter

五类:Authorization Filter、 Resource Filter、 Action Filter 、Exception Filter 、Result Filter

新建文件:CustomExecptionFilterAttribute.cs 

public class CustomExecptionFilterAttribute : ExceptionFilterAttribute
    { 
        /// 
        /// 当异常发生时  进来处理
        /// 
        /// 
        public override void OnException(ExceptionContext context)
        {
            if (!context.ExceptionHandled)//当异常未处理
            {
                Console.WriteLine($"{context.HttpContext.Request.Path} {context.Exception.Message}"); 
                context.Result = new JsonResult(new
                {
                    Result = false,
                    Msg = "发生异常,请联系管理员"
                });
                context.ExceptionHandled = true;//异常标记-》已处理
            }
        }
    }

Filter三种注册方式:

  1. [CustomExecptionFilterAttribute]   Action注册--》 仅方法生效 
  2. [CustomExecptionFilterAttribute]  Controller注册--》仅控制器生效
  3. 全局注册   Startup--ConfigureServices  --》全局生效
    services.AddControllersWithViews(
        option =>
        {
                option.Filters.Add(typeof(CustomExecptionFilterAttribute));//全局注册--错误处理
        }
        );

404错误是住不到的

AOP好处:

  1. 聚焦业务逻辑,轻松扩展功能
  2. 代码复用,集中管理

进阶需求:错误日志想要记录在txt日志文件里

    public class CustomExecptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly ILogger _logger;
        public CustomExecptionFilterAttribute(ILogger logger)
        {
            _logger = logger;
        }

        /// 
        /// 当异常发生时  进来处理
        /// 
        /// 
        public override void OnException(ExceptionContext context)
        {
            if (!context.ExceptionHandled)//当异常未处理
            {
                Console.WriteLine($"{context.HttpContext.Request.Path} {context.Exception.Message}");
                _logger.LogError($"{context.HttpContext.Request.Path} {context.Exception.Message}");
                context.Result = new JsonResult(new
                {
                    Result = false,
                    Msg = "发生异常,请联系管理员"
                });
                context.ExceptionHandled = true;//异常标记-》已处理
            } 
        }
    }

CustomExecptionFilterAttribute是一个特性,特性是编译时确定的,构造函数只能传递常量,不能传递变量;

Filter注入方式:

  1. 全局注册 Startup--ConfigureServices   自动注入  控制器不需要注册
  2. [ServiceFilter(typeof(CustomExecptionFilterAttribute))]    控制器注入+Startup-》ConfigureServices  (services.AddTransient();//注册)
  3. [TypeFilter(typeof(CustomExecptionFilterAttribute))]   控制器注入
  4. IFilterFactory

若文章有错误,请评论或者私信指出,谢谢

你可能感兴趣的:(.net,core,asp.net,后端)