当前位置: 代码迷 >> 综合 >> Asp.Netcore 使用AspectCore做拦截器
  详细解决方案

Asp.Netcore 使用AspectCore做拦截器

热度:67   发布时间:2023-12-26 19:12:34.0

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";
        }

 

 

 

  相关解决方案