提问人:Melu 提问时间:11/4/2023 最后编辑:Melu 更新时间:11/7/2023 访问量:108
C# ASP.NET Core 6 Web API、线程安全、用于重用访问令牌的单一实例实现
C# ASP.NET Core 6 Web API, Thread Safe, singleton implementation to reuse access tokens
问:
我的 ASP.NET Core 6 Web API A 正在调用另一个返回访问令牌的 API B,我想使用相同的令牌(直到它过期)随后调用 B 上的多个操作。我创建了一个令牌类,它将保存令牌的实际值和过期时间
public sealed class Token
{
private static readonly Lazy<Token> lazy =
new Lazy<Token>(() => new Token());
public static Token Instance { get { return lazy.Value; } }
public Token()
{
}
public string TokenValue { get; set; }
public DateTime ExpiresOn { get; set; }
public bool HasTokenExpired()
{
if (string.IsNullOrEmpty(TokenValue))
{
return true;
}
if (DateTime.UtcNow >= ExpiresOn.AddSeconds(-20))
{
return true;
}
return false;
}
}
然后我有另一个类,它有两个操作:
Public class TokenResource : ITokenResource
{
private static Token Token
{
get
{
return Token.Instance;
}
}
public async Task<string> GetTokenAsync()
{
if (Token.HasTokenExpired())
{
await RefreshTokenAsync();
}
return Token.TokenValue;
}
public async Task RefreshTokenAsync()
{
// does a http post and gets the token
var tokenString = JObject.Parse(tokenResponseAsString)["access_token"].Value<string>();
Token.TokenValue = tokenString;
Token.ExpiresOn = SetTokenExpirationDate(tokenString);
}
}
在启动时,我将类设置为单例:TokenResource
builder.Services.AddSingleton<ITokenResource, TokenResource>();
所有这些似乎都运行良好,但我想知道这是否是实现线程安全单例的正确方法,或者这是否是矫枉过正,我们不需要锁定对象,因为它已经是单例。
- 更新 - 删除和添加ReaderWriterLockSlim
Lazy<T>
答: 暂无答案
评论
ITokenResource
Singleton
RefreshTokenAsync()
HasTokenExpired()
Lazy<T>
Interlocked.CompareExchange
Lazy<T>