2010-03-11 8 views
3

여러 클라이언트에서 호출하는 WCF 서비스가 있습니다. 전 세계적으로 가치를 저장하고 관리해야합니다. 나는이 비슷한이 내 서비스에WCF 정적 변수 호출마다 재설정 재설정

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)] 

: 내 서비스에 나는 다음과 같은 속성이

private static int counter; 

public void PrintCounter() 
{ 
    counter++; 
    StreamWriter sw = new StreamWriter(@"C:\outFile.txt", true); 
    sw.WriteLine("Counter: " + counter); 
    sw.Close(); 
} 

WCF의 내 제한된 지식으로가, 내가 싱글 톤 서비스를하고 있음을 추정 할 내 개인 변수가 정적이라는 사실, 서비스에 대한 모든 호출이 동일한 객체를 사용한다는 것. 내 로그 출력을 볼 때

그러나, 나는 다음을 참조 : 나는 것보고 기대했던

Counter: 1 
Counter: 1 

:

Counter: 1 
Counter: 2 

내가이 일을 위해 뭔가 빠진 오전 나는 그것을 필요로하는 방법? 어떤 종류의 캐시에 객체를 저장해야합니까? 어떤 도움이라도 대단히 감사합니다.

필요한 경우 더 많은 코드를 게시 할 수 있습니다.

+0

같은 것들을보고있다 정적 변수 값을 유지해야하는 서비스 인 Net TCP WCF 서비스로 옮겨야했습니다 .RESTful 웹 서비스를 '라우터'로 사용하여 TCP 서비스를 호출합니다. – Brandon

답변

2

이 서비스는 싱글 톤 서비스이므로 하나의 인스턴스 만 존재할 것입니다. 왜 이것을 정규 클래스 멤버 변수로 만들지 않습니까 ??

ConcurrencyMode가 single로 설정되었으므로 변수에 대한 동시 액세스에 대해 걱정할 필요조차 없습니다.

한편, ConcurrencyMode = Single 인 싱글 톤은 병목 현상이 될 수있는 정말로 느린 서비스를위한 레시피입니다. 따라서 코드를 ConcurrencyMode = 잠재적으로 멤버 변수에 동시에 액세스 할 수있는 다중.

+1

[ ServiceBehavior] 속성을 사용하고 동일한 작업을 수행합니다. 2 가지 다른 서비스에서 호출한다는 점에 유의해야합니다. 두 경우 모두 브라우저. – Brandon

+0

글쎄, 싱글 톤이 더 이상 없다면, 들어오는 각 요청은 서비스 클래스의 브랜드 스팽킹 새로운 인스턴스를 얻습니다.이 인스턴스는 완료된 후에 폐기됩니다. 이 경우에 "주변에"남아 있지 않습니다. –

+0

세션 관리를 테스트하는 동안 내 시나리오가 발견되었습니다. 사용자가 로그인하면 인증 토큰에 포함 된 세션 GUID를 제공합니다. 몇 분 후에 세션이 종료됩니다. 우리는 이것을 GUID의 정적 목록으로 저장했지만 각 WCF 서비스 세션마다 새로운 세션 목록을 얻습니다. 이 세션 정보를 memcached와 같은 일종의 데이터 저장소로 푸시하는 것이 현명하다고 생각하기 시작했습니다. – Brandon

0

서버가 하나만 있다고 가정하므로로드 균형 조정이 필요하지 않습니다.

IIS가 어떤 이유로 응용 프로그램을 재활용하지 않는 한 정적 데이터가 있어야합니다?

BTW, 당신은 정말에 대한 Interlocked.Increment를 사용한다, 그러나 이것은 당신이 대규모로드하지 않는 한 당신이 (보고있는 문제가 발생하지해야하고, 사람이 보는 경우에 당신은

10003120 
10003121 
10003121 
10003121 
10003122