是否存在从多个线程同步访问令牌创建的通用模式?

时间:2016-10-07 13:00:42

标签: c# multithreading odata access-token

我有OData系统的客户端,它(系统)以下列方式工作。

  • 首先我必须发送特殊请求来检索令牌
  • 然后我发出请求,将令牌附加到每个请求。
  • 在某个时间请求可能会失败,说令牌已过时。那么我应该再做一个特殊要求来获得一个新的令牌

当我只有一个帖子时,这很容易。但是我想让多个线程处理请求并且共享相同的令牌。此外,如果多个并发请求因令牌无效而失败,我想发送一次特殊请求,其他客户端开始使用更新的令牌

如果重要,我正在使用C#。

是否存在同步此类请求的通用解决方案?

1 个答案:

答案 0 :(得分:2)

在不了解您的实施的情况下,一个选项可能是MemoryCache

您的线程可以检查缓存中是否有特定的'tokenkey'并获取其值。如果您想要阻止401s或其他未经授权的结果,可以在已知过期之前在MemoryCache中设置过期。

以下是我在web api调用中获取/设置auth标头所需的新令牌的示例:

private string GetNewToken()
{
    lock (cacheLock)
    {
        // no token in cache so go get a new one
        var newToken = TokenServiceAgent.GetJwt();

        // number of minutes (offset) before JWT expires that will trigger update of cache 
        var cacheLifetime = 15

        CacheItemPolicy cip = new CacheItemPolicy()
        {
            AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(cacheLifetime.Value))
        };

        MemoryCache.Default.Set("tokenkey", newToken, cip);

        return newToken;
    }
}

编辑:无法让代码块在SO编辑器中发挥出色