解决“当前扩展缓存策略没有进行注册”的错误
造成这个错误的原因是在使用 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 = 设置微信 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; 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毫秒左右的启动时间。 ?
? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |