• 解决“当前扩展缓存策略没有进行注册”的错误


      造成这个错误的原因是在使用 Senparc.Weixin SDK 或者 CO2NET 的扩展缓存的时候,没有对扩展缓存策略进行注册(激活)。解决方案如下:

      第一步:先升级到 Senparc.Weixin 的最新版本 v5.0.11 以上(依赖 CO2NET v0.1.11 以上):https://www.nuget.org/packages/Senparc.Weixin

      第二步:检查是否加入了一行代码:

    .NET Framework:

      在 global.asax.cs 文件的 Application_Start() 方法中,加入代码(注意 using 两个命名空间:Senparc.CO2NET 和 Senparc.Weixin):

    //...
    
    var isGLobalDebug = true;//设置全局 Debug 状态
    var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug);
    var register = RegisterService.Start(senparcSetting).UseSenparcGlobal();//CO2NET全局注册,必须!
    
    var isWeixinDebug = true;//设置微信 Debug 状态
    var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug);
    register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);////微信全局注册,必须!
    
    //...

    .NET Core:

      在 startup.cs 中的 ConfigureServices() 和 Configure() 中分别加入代码(注意 using 两个命名空间:Senparc.CO2NET 和 Senparc.Weixin):

    public void ConfigureServices(IServiceCollection services)
    {
        //...
        services.AddSenparcGlobalServices(Configuration)//Senparc.CO2NET 全局注册
                .AddSenparcWeixinServices(Configuration);//Senparc.Weixin 注册(如果使用Senparc.Weixin SDK则添加)
        //...
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting)
    {
        //...
        
        IRegisterService register = RegisterService.Start(env, senparcSetting.Value).UseSenparcGlobal();// 启动 CO2NET 全局注册,必须!
        
        register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value);//微信全局注册,必须!
        //...
    
    }

     只需要上述几行代码即可。 

      进阶

      如果你的系统里面自己扩展了 CO2NET 的缓存策略(非 Senparc 官方的 LocalContainerCacheStrategy、RedisContainerCacheStrategy、MemcachedContainerCacheStrategy等),那么上述的 .UseSenparcGlobal([第一个参数], [第二个参数]) 的第二个参数需要提供一个扩展的列表,以 .net core为例:

    RegisterService.Start(env /* .net framework 没有这个参数 */, senparcSetting).UseSenparcGlobal(false, GetExCacheStrategies);//必须

      其中,GetExCacheStrategies 方法如下(以 .net core Demo 为例,.net framework 下面的 Demo 没有 senparcWeixinSetting 参数):

            /// <summary>
            /// 获取扩展缓存策略
            /// </summary>
            /// <returns></returns>
            private IList<IDomainExtensionCacheStrategy> GetExCacheStrategies(SenparcWeixinSetting senparcWeixinSetting)
            {
                var exContainerCacheStrategies = new List<IDomainExtensionCacheStrategy>();
    
                //注意:以下两个 if 判断仅作为演示,方便大家添加自定义的扩展缓存策略,
                //     只要进行了 register.UseSenparcWeixin() 操作,Container 的缓存策略下的 Local、Redis 和 Memcached 系统已经默认自动注册,无需操作!
    
                #region 演示扩展缓存注册方法
    
                //判断Redis是否可用
                var redisConfiguration = senparcWeixinSetting.Cache_Redis_Configuration;
                if ((!string.IsNullOrEmpty(redisConfiguration) && redisConfiguration != "Redis配置"))
                {
                    exContainerCacheStrategies.Add(RedisContainerCacheStrategy.Instance);
                }
    
                //判断Memcached是否可用
                var memcachedConfiguration = senparcWeixinSetting.Cache_Memcached_Configuration;
                if ((!string.IsNullOrEmpty(memcachedConfiguration) && memcachedConfiguration != "Memcached配置"))
                {
                    exContainerCacheStrategies.Add(MemcachedContainerCacheStrategy.Instance);//TODO:如果没有进行配置会产生异常
                }
    
                #endregion
    
                //扩展自定义的缓存策略
    
                return exContainerCacheStrategies;
            }

       注意:上述代码以 Senparc.Weixin SDK 的扩展缓存实现为例(用于 Container 的 Redis 和 Memecahed)实际上这两个扩展缓存再加上 LocalContainerCacheStrategy 已经在执行 register.UseSenparcWeixin() 的时候自动注册,无需多此一举。

      当然,这样有时候还是会稍显麻烦,所以我们又提供了一个自动扫描所有的扩展缓存并注册的方法,完全由系统自动完成:

    RegisterService.Start(senparcSetting).UseSenparcGlobal(true, null);//必须

      注意:当地一个参数为 true 时,虽然省去了指定缓存的代码,但是全局的扫描需要消耗一定的时间,会导致系统启动时间增加。粗略地测试,每个程序集(可近似理解为dll)会延长8毫秒左右的启动时间。

    PS:

       Senparc.Weixin 默认提供了三种 Container 的扩展缓存策略:

    • LocalContainerCacheStrategy
    • RedisContainerCacheStrategy
    • MemcachedContainerCacheStrategy

      您也可以编写自己的扩展缓存策略。

  • 相关阅读:
    asp.net的处理机制(.ashx/.aspx)
    docker使用记录二:mysql安装与配置
    docker使用记录一日常使用的命令
    git笔记十:本地仓库同步到gitlab
    git使用记录九:开发中临时加塞了紧急任务怎么处理
    git使用记录八:不同提交的指定文件的差异
    git使用记录七:对工作区和暂存区的一些操作场景
    git使用记录六:对commit的message做处理
    git使用记录四:.git分析
    git使用记录三:查看日志
  • 原文地址:https://www.cnblogs.com/szw/p/9265828.html
Copyright © 2020-2023  润新知