요청 사이에 물건을 저장해야하는 경우 이러한 요청이 들어올 때 해당 요청을 저장하기 위해 적절한 잠금 기능이있는 정적 사전을 만들거나이 정보를 데이터베이스 (또는 다른 외부 저장소)에 저장하고 각 메소드 호출에 존재하는지 확인하십시오. 그 이유는 모든 클라이언트 요청에서 서비스 클래스가 인스턴스화되기 때문입니다.
사용자가 서비스에 접근 할 때 이미 사용자 datetime을 업데이트하고 있으므로이 사용자가 datetime 필드와 비교하여 활성 사용자인지 여부를 확인하는 것이 좋습니다. 이것은 모든 호출에 대해 정확하다는 장점이 있습니다 (사전이 서비스가 다시 시작되면 사전과 db가 동기화되지 않을 수 있습니다). 데이터베이스에는 동시성을 처리 할 수있는 메커니즘이 이미 있으므로 싱글 톤 객체에 대한 자체 잠금 솔루션을 롤링하는 대신 데이터 저장소에 복잡성을 가할 수 있습니다.
두 번째 솔루션이 빠르지 않다면 (그리고 앱을 프로파일 링하여 병목 현상이라고 판단한 경우), 다른 옵션은 데이터를 먼저 확인할 수 있도록 db 앞에서 일종의 캐시 솔루션을 사용하는 것입니다 DB에 가기 전에 메모리에 저장하십시오. 이 캐시 객체는 사전과 같이 정적 일 필요가 있으며 다른 멀티 스레드 응용 프로그램과 마찬가지로 잠그는 것과 관련된 함정이 있습니다.
EDIT :이 호스팅 된 WCF 서비스가 Silverlight 응용 프로그램의 사용자를위한 세션 저장소로 사용되고 데이터가 외부 데이터 저장소에 저장되지 않는 경우 해당 데이터가 활성 상태인지 추적하는 것이 미션 크리티컬. 이 데이터는 설명 된대로 정확하다고 보장 할 수 없습니다.
서비스에 결함이 있고 재부팅해야하는 경우 (자체 호스트이므로 오류가 발생한 이벤트를 모니터링하는 것이 좋습니다) 서비스 호스트를 처리하고 새 인스턴스를 인스턴스화해야합니다. Guid 데이터를 보관할 수있는 유일한 방법은 재시작 사이에 서비스로 리바운드되는 경우입니다 (호스트 응용 프로그램 자체가 다시 시작되지 않은 경우 다른 문제 임). 더 나은
private Dictionary<Guid,string> _session;
Service service = new Service(_session);
_serviceHost = new ServiceHost(service, GetUriMethodInHostApp());
는 외부에이를 저장하고 @marc_s에서 알 수 있듯이 조회를 수행하는 것입니다. 그런 다음이 복잡성은 사라집니다.
사용자 목록과 같은 영구 정보가 영구 저장소 (예 : 데이터베이스)에 속합니다. –
자체 호스팅 (콘솔 앱, Windows 서비스 등)은 어떻게됩니까? –