2016-10-07 3 views
2

나는 OData 시스템에 클라이언트를 가지고 있으며, 그것 (시스템)은 다음과 같은 방식으로 작동한다.다중 스레드에서 액세스 토큰 생성을 동기화하는 공통 패턴이 있습니까?

  • 먼저 나는 토큰를 검색하는 특별 요청을 보낼 수 있습니다.
  • 각 요청에 토큰을 첨부하여 요청합니다.
  • 특정 시간에 토큰이 구식이라는 요청이 실패 할 수 있습니다. 나는 내가 하나 개의 스레드가있을 때이 용이 한 새로운 토큰

얻기 위해 다른 특별 요청을해야합니다. 하지만 여러 개의 스레드가 요청을하고 모든 스레드가 동일한 토큰을 공유하도록하고 싶습니다. 또한 토큰이 무효화되어 하나 이상의 동시 요청이 실패한 경우 특별 요청을 정확하게 보내고 다른 클라이언트는 업데이트 된 토큰을 사용하기를 원합니다.

중요한 경우 C#을 사용하고 있습니다.

그런 요청을 동기화하는 일반적인 해결책이 있습니까?

답변

2

구현에 대해 더 많이 알지 못하면 하나의 옵션은 MemoryCache 일 수 있습니다.

스레드가 캐시에서 특정 'tokenkey'를 확인하고 그 값을 얻을 수 있습니다. 401 또는 다른 인증되지 않은 결과를 방지하려면 알려진 만료 날짜보다 앞서 MemoryCache에 만료를 설정할 수 있습니다. 여기

내가 들어갈 때 사용하는 예입니다/웹 API 호출에서 인증 헤더에 필요한 새 토큰 설정 :

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 편집기에서 좋은 플레이를 할 수 없습니다를

+0

HTML 편집기에서 탭을 사용하지 마십시오. – VMAtm