我的情况是:我的应用程序中有一个Http Authentication请求,它返回一个访问令牌,用于后续的Http请求。
我可以同时执行多个请求,但是它们需要一个有效的访问令牌,因此在每次请求之前我都会检查访问令牌是否有效。
如果它不存在或无效,我必须创建另一个身份验证请求以检索新的访问令牌。问题是,每个其他请求必须在执行之前等待此请求的答案。此外,我不能同时运行两个身份验证请求,新的必须等待旧的完成才能执行。
那么,我怎么能收到一些我可以说的请求:“如果访问令牌无效,请等待我在执行请求之前要执行的新身份验证请求”?
答案 0 :(得分:1)
很容易推出自己的类型,根据您的要求管理访问令牌的生命周期:
class AccessTokenManager
{
private readonly SemaphoreSlim Mutex = new SemaphoreSlim(1, 1);
private AccessToken LastSeenToken;
public async Task<AccessToken> ResolveToken(CancellationToken ct)
{
await this.Mutex.WaitAsync(ct);
try
{
if (this.LastSeenToken == null || !this.LastSeenToken.IsValid)
{
this.LastSeenToken = await this.GetNewAuthTokenAsync(ct);
}
return this.LastSeenToken;
}
finally
{
this.Mutex.Release();
}
}
private async Task<AccessToken> GetNewAuthTokenAsync(CancellationToken ct)
{
// Pure retrieve new token implementation.
}
}
注意:为简洁起见,省略了ConfigureAwait(false)
。
然后,只要您需要有效令牌(大概在每个请求的开头),您只需使用await AccessTokenManagerInstance.ResolveToken
,它会出去为您获取新的有效令牌,或者吐出缓存的令牌。如果您知道在应用程序中只需要一个实例,则可以将管理器实现为单例。