解決“當前擴展緩存策略沒有進行注冊”的錯誤


  造成這個錯誤的原因是在使用 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

  您也可以編寫自己的擴展緩存策略。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM