2010-05-07 3 views
5

세션을 사용하는 WCF 응용 프로그램이 있습니다.WCF : 세션 종료시기를 확인하는 방법은 무엇입니까?

세션이 종료되면 던져 질 중앙 이벤트가 있습니까? 세션이 WITHOUT (!) 메소드 호출 (네트워크 연결 끊김, 클라이언트 충돌 - 그래서 "logout"메소드 호출 없음)이 끝나는 시점을 어떻게 알 수 있습니까? 이 콜백 인터페이스를 사용하고 있기 때문에 기본적으로

[ServiceBehavior(
    InstanceContextMode = InstanceContextMode.PerSession, 
    ConcurrencyMode = ConcurrencyMode.Reentrant, 
    UseSynchronizationContext = false, 
    IncludeExceptionDetailInFaults = true 
)] 

:

서버

는 다음과 같이 호스팅됩니다.

어떤 아이디어)

지금, 나는 기본적으로 세션이 종료 백엔드 저장소에서 생성 된 인스턴스를 decoubple해야합니까?

답변

4

CommunicationObject

통신 개체에서 here

인스턴스 컨텍스트가 파생 인스턴스 컨텍스트의 좋은 설명은 closing 이벤트가있다입니다.

나는이 작업을 직접 해보지 않았지만, 이론적으로이 이벤트를 사용하여 세션이 닫힐 때이 이벤트에 후크하여이 백엔드 저장소와 연결을 끊을 수 있어야합니다.

-1

시간 초과 값을 설정하고 제한 시간이 경과하기 바로 전에 실행되는 PingService() 메소드를 생성하면 보내기 및 수신 제한 시간이 재설정됩니다.

콜백을 시도하기 만하면 콜백을 시도하고, 바인딩 SendTimeout 값 (기본값은 1 분이라고 생각합니다)보다 오래 걸리면 시간 초과 오류가 발생하고 연결을 끊으십시오.

이 코드는 싱글/PerCall InstanceContextMode 작동하지 않습니다

+0

나쁜 대답 - 나는 이미 (초 당 핑 등) - 네트워크 또는 전원 손실 또는 무언가에 대한 시간 초과로 인해 클라이언트가 DEAD 상태가되지 않도록하고, 정확히 내가 원하는/잡을 필요가있다. 즉, 연결이 끊어 지거나 세션이 종료 된 시점을 알아야합니다.) 여기에는 브라우저가 전혀 포함되어 있지 않습니다 (왜 모든 사람들이 웹 서비스가 어리석은 지루한 웹 사이트라고 생각합니까?). 여기에는 전혀 클라이언트 측이 관여하지 않습니다. 제 질문은 100 % 서버 측입니다. -1. – TomTom

+0

시도해 볼 수 있습니다 : callbackClient.opContext.Channel.State. – DavyMac23

8
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
class MyService : IService 
{ 
    public MyService() 
    { 
     // Session opened here 
     OperationContext.Current.InstanceContext.Closed += InstanceContext_Closed; 
     // get the callback instance here if needed 
     // OperationContext.Current.GetCallbackChannel<IServiceCallback>() 
    } 

    private void InstanceContext_Closed(object sender, EventArgs e) 
    { 
     // Session closed here 
    } 
} 

(전원 등, 등, 등, 외출 브라우저 충돌) 정상적으로 연결이 끊긴 사용자를 잡을 수있는 방법은 없습니다.

관련 문제