.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

Filter总共有五种,Authorization Filter,Resource Filter,Exception Filter,Action Filter,Result Filter

Exception Filter 设置

新增全局异常过滤器GlobalExceptionFilter.cs,

当出现异常时进入此方法,可在这针对不同的异常做相关处理并返回指定数据,避免直接把错误暴露给用户 
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
public class GlobalExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        Exception ex = context.Exception;
        string errMsg = "GlobalExceptionFilter-OnException:" +                 ex.Message;
        if (context.Exception.GetType() == typeof(ExecuteException))
     {
        //针对不同的自定义异常,做不同处理
        MsgModel<string> msgModel = new MsgModel<string>()
        {
            Status = false,
            Msg = errMsg,
            Errcode = "AA001"
        };
        context.Result = new JsonResult(msgModel);
        context.ExceptionHandled = true;
    }
    else
    {
      context.Result = new JsonResult(errMsg);
      context.ExceptionHandled = true;
    }

    LogHelper.Error(errMsg);
  }
}                
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

然后在Startup.cs 注入过滤器

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 

 Action Filter 设置

新增全局过滤器GlobalActionFilter.cs 

在方法执行前后,会跳转至以下两个方法,方便追踪接口执行情况 

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
public class GlobalActionFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
    //LogHelper.Info("OnActionExecuted");
    //执行方法后执行这
   }

  public void OnActionExecuting(ActionExecutingContext context)
  {
  //LogHelper.Info("OnActionExecuting");
  //执行方法前先执行这
  }
}    
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

Authonization Filter

权限控制过滤器
通过 Authonization Filter 可以实现复杂的权限角色认证登陆授权等操作

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
/// <summary>
    /// 实现自定义授权
    /// </summary>
    public class AuthorizeFilter : IAuthorizationFilter
    {
        /// <summary>
        /// 请求验证,当前验证部分不要抛出异常,ExceptionFilter不会处理
        /// </summary>
        /// <param name="context"></param>
        public void OnAuthorization(AuthorizationFilterContext context)
        {

        //这里可以做复杂的权限控制操作
        //if (context.HttpContext.User.Identity.Name != "1") //简单的做一个示范
        //{
        // //未通过验证则跳转到无权限提示页
        // RedirectToActionResult content = new RedirectToActionResult("NoAuth", "Exception", null);
        // context.Result = content;
        //

        }
    }
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

Resource Filter

资源过滤器
可以通过Resource Filter 进行资源缓存防盗链等操作。
使用Resource Filter 要求实现IResourceFilter 抽象接口

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
public class ResourceFilter : Attribute,IResourceFilter
    {
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // 执行完后的操作
        }

        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // 执行中的过滤器管道
        }
    }
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

Result Filter

结果过滤器,可以对结果进行格式化、大小写转换等一系列操作。

使用Result Filter 需要实现IResultFilter 抽象接口,接口要求实现
OnResultExecuting 方法 和OnResultExecuted 方法

    • OnResultExecuting :Called before the action result executes. 在操作结果执行之前调用
    • OnResultExecuted :Called after the action result executes. 在操作结果执行之后调用
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
public class ResultFilter : Attribute, IResultFilter
 {
        public void OnResultExecuted(ResultExecutedContext context)
        { 
            // 在结果执行之后调用的操作...
        }

        public void OnResultExecuting(ResultExecutingContext context)
        {
            // 在结果执行之前调用的一系列操作
        }
    }
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

完毕 可以在全局注入

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 AOP拦截器

其实好多项目中,做一些数据拦截、数据缓存都有Aop的概念,只是实现方式不一样;之前大家可能都会利用过滤器来实现Aop的功能,如果是Asp.NetCore的话,也可能会使用中间件; 而这种实现方式都是在请求过程中进行拦截,如果我们想在服务层中做切面的话,那种方式显然不好使了,需要用到“真正的Aop”。

 真正的Aop”其实就是动态代理

 

LogInterceptor 设置

安装Castle.Core,Autofac.Extras.DynamicProxy

新建LogInterceptor.cs ,继承IInterceptor

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
   public class LogInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            try
            {
                invocation.Proceed();
                Dapper.Logger.LogHelper.logger.Info(invocation.Method.Name);
            }
            catch (Exception ex)
            {
                Dapper.Logger.LogHelper.logger.Error(invocation.Method.Name + " " + ex.ToString());
            }
        }
    }
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

在Startup.cs 新增以下代码

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 

 

针对某个类或者某个方法做拦截时

首先新建一个拦截器 MyInterceptor

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
    public class MyInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            try
            {
                invocation.Proceed();
                NLogHelper.logger.Info(invocation.Method.Name);
            }
            catch (Exception ex)
            {
                NLogHelper.logger.Error(invocation.Method.Name + " " + ex.ToString());
            }
        }
    }
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

然后Startup.cs 中ConfigureContainer代码如下

把LogInterceptor 代码注释,但是要保留接口拦截EnableInterfaceInterceptors() ,注入MyInterceptor

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器
public void ConfigureContainer(ContainerBuilder builder)
    {
        //builder.RegisterType<LogInterceptor>();

        builder.RegisterType<MyInterceptor>();

        builder.RegisterType<DbFactory>().As<IDbFactory>();

        //业务逻辑层所在程序集命名空间
        Assembly service = Assembly.Load("Summer.Service"); //注:webapi要引用接口和类,不然这里读不到
                                                            //接口层所在程序集命名空间
        Assembly repository = Assembly.Load("Summer.IService");
        //自动注入
        builder.RegisterAssemblyTypes(service, repository)
        .Where(t => t.Name.EndsWith("Service"))
        .AsImplementedInterfaces()
        .InstancePerLifetimeScope()
        .EnableInterfaceInterceptors() //开启接口拦截
                                       //.InterceptedBy(typeof(LogInterceptor)) //设置全局拦截器,统一由LogInterceptor拦截所有接口的调用
        ;
    }
.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

然后在需要拦截的接口中添加以下代码

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 拦截器设置完毕,当调用ITestService 的全部方法都会跳转拦截器

 

 

Filter和 LogInterceptor 可以同时共存,执行顺序是:

ActionFilter 的OnActionExecuting =》LogInterceptor 的Intercept =》ActionFilter 的OnActionExecuted 

如果接口有异常,不会跳转LogInterceptor ,而是进入ExceptionFilter,顺序是:

ActionFilter 的OnActionExecuting =》ActionFilter 的OnActionExecuted =》ExceptionFilter 的OnException

原文 https://www.cnblogs.com/redo/p/12575119.html 

 

AOP的应用

引入三个包,通过Nuget安装,Autofac开头,如下

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 注: 其中Autofac.Extras.DynamicProxy就是AOP相关组件,其中包含了Castle.Core,所以不用单独安装Castle.Core.

.net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 .net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 .net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 .net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 .net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

 

 .net core 3.1 过滤器(Filter) 和AOP面向切面拦截器

总结:

  AOP在做一些业务前置或后置处理上时很有用的,使用比较灵活,无需修改原有代码逻辑,比起修改原有代码维护相对好多啦!!!

 原文 https://www.cnblogs.com/zoe-zyq/p/12803450.html

上一篇:[译]如何在ASP.NET Core中实现面向切面编程(AOP)


下一篇:SpringBoot2.0 @Cacheable 添加超时策略