我想从我的ASP.NET Core应用程序中使用通过某种令牌身份验证来保护的API。 由于获取令牌的过程需要相当长的时间(而且我认为不必要多次设计是很糟糕的设计),因此我想确保获取令牌的API调用在没有令牌的情况下仅执行一次,或者过期。
这是我的做法: 我创建了一个新服务并将其注册为单例
compilation debug="true"
服务本身看起来像这样
services.AddSingleton<IService, Service>();
这似乎可行,但是我认为应该有一种更优雅的方式来管理它。你们如何处理这个问题?
答案 0 :(得分:0)
您可以为此使用缓存。将其策略的AbsoluteExpiration
设置为ValidTo
(最好使用较小的偏移量),一旦过期,它将自动被驱逐。像这样:
private readonly ObjectCache _cache = MemoryCache.Default;
public T GetToken()
{
if (!_cache.Contains("token"))
{
GetAndCacheNewToken();
}
return _cache.Get("token") as T;
}
public void GetAndCacheNewToken()
{
T token;
// Get your token.
_cache.Add(
"token",
token,
new CacheItemPolicy() {AbsoluteExpiration = token.ValidTo.AddSeconds(-1)});
}
我将令牌的类型标记为T
,因为我不知道它在您的应用程序中是什么类型。
答案 1 :(得分:0)
嘿@askingdumbquestions,欢迎来到社区
您最初的方法很有意义,但有一些缺点:
但是还有另一种方法:第一次构造Service
时,您要获取令牌,然后启动一个异步任务,该任务将在令牌过期前几分钟获取/刷新令牌!这样可以确保您始终准备好有效的令牌,并且不必进行昂贵且容易出错的线程同步,并消除了其他恶习必须获取令牌的那些请求的延迟峰值。
让我知道这是否有帮助,或者您需要更详细的说明!