【发布时间】:2021-01-14 19:27:03
【问题描述】:
我正在使用IMemoryCache 来缓存从身份服务器检索到的令牌。
过去我使用过Microsoft.Extensions.Caching.Abstractions 库中提供的GetOrCreateAsync 扩展方法。
这非常有用,因为我可以同时定义功能和到期日期。
但是,使用令牌,在请求完成之前,我不会知道 expires in x 秒数的值。 我想通过根本不缓存令牌来解释不存在的值的用例。
我已经尝试了以下
var token = await this.memoryCache.GetOrCreateAsync<string>("SomeKey", async cacheEntry =>
{
var jwt = await GetTokenFromServer();
var tokenHasValidExpireValue = int.TryParse(jwt.ExpiresIn, out int tokenExpirationSeconds);
if (tokenHasValidExpireValue)
{
cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(tokenExpirationSeconds);
}
else // Do not cache value. Just return it.
{
cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(0); //Exception thrown. Value needs to be positive.
}
return jwt.token;
}
如您所见,当我尝试设置无时间到期TimeSpan.FromSeconds(0) 时会引发异常。
除了分别调用Get 和Set 方法之外,还有其他方法吗?
如果可能,我想使用GetOrCreateAsync 方法。
【问题讨论】:
-
使用
GetOrCreateAsync除了令人困惑的行为之外,您还有什么收获?如果您没有始终如一地创建条目,则调用GetOrCreateAsync零意义。 -
@DavidL 它简化了我的代码
-
但是显然不是。正如您所展示的,您对数据有不同的期望,这意味着该方法不适合您的用例。
标签: c# .net .net-core memorycache