-
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