- 
                Notifications
    
You must be signed in to change notification settings  - Fork 130
 
Open
Description
为了将accesstoken的当前所剩过期时间能返回给调用方,重新封装了下AccessTokenContainer如下:
`public class AccessTokenContainerExt: AccessTokenContainer{
public static async Task GetAccessTokenInfo(string appId, bool getNewToken = false)
{
await ValidateAppRegistered(appId).ConfigureAwait(false);
 var accessTokenBag = await TryGetItemAsync(appId).ConfigureAwait(false);
 using (await Cache.BeginCacheLockAsync(LockResourceName, appId).ConfigureAwait(false))//同步锁
 {
     if (getNewToken || accessTokenBag.AccessTokenExpireTime <= SystemTime.Now)
     {
         //已过期,重新获取
         var accessTokenResult = await CommonApi.GetTokenAsync(accessTokenBag.AppId, accessTokenBag.AppSecret).ConfigureAwait(false);
         accessTokenBag.AccessTokenResult = accessTokenResult;
         accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in);
         await UpdateAsync(accessTokenBag, null).ConfigureAwait(false);//更新到缓存
     }
 }
 return new AccessTokenInfo
 {
     AppId = accessTokenBag.AppId,
     AccessToken = accessTokenBag.AccessTokenResult.access_token,
     ExpireTime = accessTokenBag.AccessTokenExpireTime,
     ExpireIn =  (int)(accessTokenBag.AccessTokenExpireTime - DateTimeOffset.Now).TotalSeconds
 };
}
}`
验证分布式锁时, 发现多个实例都进入了竞争代码Cache.BeginCacheLockAsync 没有起作用,并查看了Redis库,也确实没有锁的数据写入, 并且验证过其他Redis功能都是正常的, 生成的accesstoken也都能正常写入Redis,目前就分布式锁有问题。
初始代码如下:
` private void UseSenparcWexin(IApplicationBuilder app)
{
var senparcSetting = app.ApplicationServices.GetRequiredService<IOptions>().Value;
var senparcWeixinSetting = app.ApplicationServices.GetRequiredService<IOptions>().Value;
 // 启动 CO2NET 全局注册,必须!
 // 关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore3/Startup.cs
 var registerService = app.UseSenparcGlobal(_environment, senparcSetting, globalRegister =>
 {
     //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须)
     globalRegister.ChangeDefaultCacheNamespace("DefaultCO2NETCache");
     #region 配置和使用 Redis          -- DPBMARK Redis
     //Register.SetConfigurationOption(senparcSetting.Cache_Redis_Configuration);
     ////以下会立即将全局缓存设置为 Redis
     //Register.UseKeyValueRedisNow(); //键值对缓存策略(推荐)
     #endregion
     #region 注册 StackExchange.Redis
     /* 如果需要使用 StackExchange.Redis,则可以使用 Senparc.CO2NET.Cache.Redis 库
      * 注意:这一步注册和上述 CsRedis 库两选一即可,本 Sample 需要同时演示两个库,因此才都进行注册
      */
     Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(senparcSetting.Cache_Redis_Configuration);
     Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐)
     #endregion
 }, true);
 
 //使用 Senparc.Weixin SDK
 registerService.UseSenparcWeixin(senparcWeixinSetting, (weixinRegister, weixinSetting) =>
 {
     //weixinRegister.UseSenparcWeixinCacheCsRedis();
     weixinRegister.UseSenparcWeixinCacheRedis();
     weixinSetting.Items
                  .Where(i => i.Key != "Default")
                  .ToArray()
                  .ForEach(item =>
     {
         if (!string.IsNullOrWhiteSpace(item.Value.WeixinAppId))
         {
             weixinRegister.RegisterMpAccount(item.Value, item.Key);
         }
         else if (!string.IsNullOrWhiteSpace(item.Value.WeixinCorpId))
         {
             weixinRegister.RegisterWorkAccount(item.Value, item.Key);
         }     
     });
 });
}`
并且分别尝试了CsRedis和StackExchange.Redis都不起作用。使用的版本是如下:运行环境是net8,

请问是哪里没有配置好吗?
Metadata
Metadata
Assignees
Labels
No labels