更新服务会话时,防止来自ASP.NET应用程序的重叠服务调用

时间:2012-03-13 09:29:52

标签: asp.net web-services token

我有一个ASP.NET Web应用程序,它显示从Web服务检索的数据。

在从服务获取实际数据之前,必须通过调用该服务中的特定方法来检索令牌。然后必须在任何后续数据方法调用中提供此令牌。该令牌在一段时间后过期,并且对具有过期令牌的数据方法的调用导致错误,并且必须检索新令牌以进行进一步通信。活动令牌保存在全局ASP.NET应用程序变量中。

这一切都很好,但如何防止重叠令牌续订?从一个用户到站点的请求触发服务调用,这会产生错误并检索新令牌并将其放入缓存中,但同时另一个用户请求发现令牌已过期并且还更新令牌。

这里没有问题吗?我无法真正地绕过它。

1 个答案:

答案 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
}

拥有这样的全局令牌可能不是最好的做法。

此代码也会在重新生成令牌时阻止所有其他令牌请求,具体取决于令牌生成所需的时间,这可能是不可接受的。