2016-10-07 4 views
2

私はODataシステムへのクライアントを持っており、それ(システム)は次のように動作します。最初複数のスレッドからアクセストークンの作成を同期させる共通のパターンはありますか?

  • 私はトークンを取得するための特別な要求を送信する必要があります。
  • 私は私の要求に応じて、トークンをそれぞれの要求に添付します。
  • 特定の時刻にトークンが古くなっていると要求が失敗することがあります。その後、私は一つのスレッドだけを持っているとき、これは簡単で、新しいトークン

取得するために別のの特別な要求を行う必要があります。しかし、私は複数のスレッドが要求を行い、すべて同じものを共有したいと思っていますトークントークンが無効化されて複数の同時リクエストが失敗した場合は、特別リクエストを正確に1回だけ送信し、他のクライアントはトークンを使用して開始します。

私はC#を使用しています。

このような要求を同期させる共通のソリューションはありますか?

答えて

2

実装の詳細がわからない場合、1つのオプションはMemoryCacheです。

あなたのスレッドは、特定のトークンキーをキャッシュでチェックし、値を取得できます。 401やその他の不正な結果を防ぐために、期限切れの前にMemoryCacheの有効期限を設定することができます。

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; 
    } 
} 

EDIT:SOエディタ

で素晴らしいプレーするコードブロックを取得することはできません。ここ

は、私は/ウェブAPI呼び出しに認証ヘッダーのために必要な新しいトークンを設定し取得するために使用する例です

+0

htmlエディタでタブを使用しないでください。 – VMAtm

関連する問題