Asp.Netcore 使用AspectCore做拦截器

1. 安装NuGet包

     <1>AspectCore.Core

     <2>AspectCore.Extensions.DependencyInjection

2.创建特性拦截器

例如:异常拦截器

      /// <summary>
    /// 异常拦截器
    /// </summary>
   public class ErrorTryCatchAttribute: AbstractInterceptorAttribute
    {
        [HandleProcessCorruptedStateExceptions]
        public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            try
            {
                await context.Invoke(next);
            }
            catch (AccessViolationException ex)
            {
                context.ReturnValue = "404";
            }
            catch (Exception ex)
            {
                context.ReturnValue = "404";
            }
        }

    }

3.如何使用拦截器。

  (1).把Startup类下的ConfigureServices 这个函数修改为如下:

  public IServiceProvider ConfigureServices(IServiceCollection services)
        {
          
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices();//拦截器只会拦截从服务注册的接口,所以AddControllersAsServices()必须添加
            var serviceContainer = services.ToServiceContainer();//容器
            return serviceContainer.Build();
        } 

 (2).注入全局拦截器,在上面的代码中添加全局配置,修改完成后如下

 

 public IServiceProvider ConfigureServices(IServiceCollection services)
        {

            //根据属性注入来配置全局拦截器
            services.ConfigureDynamicProxy(config =>
            {
                config.Interceptors.AddTyped<Attribute.ErrorTryCatchAttribute>();//Attribute.ErrorTryCatchAttribute这个是需要全局拦截的拦截器
            });


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices();
            var serviceContainer = services.ToServiceContainer();
            return serviceContainer.Build();
        } 

 (3).如果该拦截器不需要全局拦截的化,这个位置就不需要添加上面的全局配置,只需要在需要拦截的函数上面打上对应的特性标签,例如该异常拦截器

        [HttpGet("{id}")]
        [Attribute.ErrorTryCatch]//这里打上该标签就会进行拦截
        public virtual ActionResult<string> Get(int id)   //virtual,函数必须使用此装饰词,属性注入才会有效
        {
            return "value";
        }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值