我有一个ASP.NET Web应用程序,它显示从Web服务检索的数据。
在从服务获取实际数据之前,必须通过调用该服务中的特定方法来检索令牌。然后必须在任何后续数据方法调用中提供此令牌。该令牌在一段时间后过期,并且对具有过期令牌的数据方法的调用导致错误,并且必须检索新令牌以进行进一步通信。活动令牌保存在全局ASP.NET应用程序变量中。
这一切都很好,但如何防止重叠令牌续订?从一个用户到站点的请求触发服务调用,这会产生错误并检索新令牌并将其放入缓存中,但同时另一个用户请求发现令牌已过期并且还更新令牌。
这里没有问题吗?我无法真正地绕过它。
答案 0 :(得分:1)
您可以通过锁定(到期= 2小时)来完成此操作:
static class TokenGenerator
{
private static object tokenLock = new object();
private static DateTime tokenExp = DateTime.MinValue;
private static string token = null;
public static string GetToken()
{
if(tokenExp >= DateTime.UtcNow)
return token;
lock(tokenLock)
{
if(tokenExp >= DateTime.UtcNow)
return token;
// generate token
token = GenerateToken();
tokenExp = DateTime.UtcNow.AddHours(2);
}
}
}
public static string GenerateToken()
{
// generate and return token
}
拥有这样的全局令牌可能不是最好的做法。
此代码也会在重新生成令牌时阻止所有其他令牌请求,具体取决于令牌生成所需的时间,这可能是不可接受的。