2010-11-30 6 views
16

net.tcp DuplexChannel을 사용하여 WCF 자체 호스팅 서비스를 사용하고 있습니다. 서버에 나는 클라이언트의 연결을 해제하려면 다음을 실행WCF : 서버 연결이 끊어지면 클라이언트 측을 검색하는 방법

((ICommunicationObject)client.CallbackChannel).Close(); 

이 잘 작동하지만이 분리 된 것을 클라이언트에 감지 어떻게?

((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed); 

InstanceContext callback = new InstanceContext(callbackImp); 
callback.Closed += new EventHandler(callback_Closed); 

을하지만 아무것도 작동 :

은 필자 콜백의 InstanceContext 및 서버에 채널 모두 닫힌 및 폴트 - 이벤트에 매여. 나는 결코 알리지 않았다. 이제는 Im을 사용하는 회피 방법은 콜백에서 클라이언트 측과의 연결을 해제하는 메소드를 대신 사용하는 것입니다. 그러나 나는 이렇게하지 않습니다. 나는 특히 서버가 사용자의 연결을 끊을 때까지 기다리지 못하게하고 싶다.

편집

난 그냥 사실 IsTerminating =으로 표시하는 서비스 계약의 방법을 실행할 때 클라이언트 측에서 분리 할 것을 깨달았다 :

[OperationContract(IsTerminating = true)] 
void Disconnect(); 

내가 그것을 될 것이라고 생각 그 콜백 계약서도 마찬가지입니까? ... 이상한

편집

나는 내 콜백에 같은 방법을 추가 시도하고보기의 서버 지점에서 콜백 채널을 종료했지만 난 여전히 클라이언트 측에 통보있어 일부러 이것에 대해 좀 더 많은 정보를 발견 :

서버가 콜백 채널을 중단, 오류가 다시 클라이언트로 여행을, 클라이언트 오류 우리는 클라이언트의 폴트 이벤트를 얻을.

서버가 콜백 채널을 닫으면 클라이언트가 닫기를 발행 할 때까지 세션이 여전히 열려 있습니다 ( ).

클라이언트가 채널 을 닫으면 닫힌 이벤트가 표시됩니다.

이 문에 따르면 Close 이벤트는 서버에서 콜백 채널을 닫음으로써 발생하지만 클라이언트는이를 닫아야합니다. 그래서 콜백의 종료 Disconnect-method에서 클라이언트에서 Close를 실행할 수 있습니다. 또는 콜백 서버 쪽에서 중단 메서드를 사용할 수 있고 콜백에서 Disconnect 메서드를 사용하지 않고 건너 뛸 수 있습니다. 나는 정직하게 어떤 것을 내가 알지 못한다. 흠.

편집

나는 중단-접근했다. 그것은 가장 논리적 인 방법처럼 보였고 정말 잘 작동합니다. 클라이언트는 callback-instancecontext에서 Faulted-event로 알립니다. 좋은.

+0

이 문제는 저도 마찬가지입니다. http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev

답변

2

은 내가 중단-접근했다. 그것은 가장 논리적 인 방법처럼 보였고 정말 잘 작동합니다. 클라이언트는 callback-instancecontext에서 Faulted-event로 알립니다.

1

채널을 닫는 클라이언트에게 알려주는 콜백 채널을 닫기 직전에 간단히 콜백을 수행 할 수 있습니다.

그래서 그냥 코드 행하기 전에 :

((ICommunicationObject)client.CallbackChannel).Close(); 
+0

이것은 작동하지 않습니다. – Sentry

+0

작동하지 않는 것에 대해 좀 더 자세히 알려주십시오. .... 콜백 채널을 사용하여 실행중인 코드가있는 소프트웨어가 있기 때문에 제대로 작동한다는 것을 알고 있습니다. 6 년 전의 정확한 구현을 상기하지 마십시오. 그러나 imho는 단지 작동하지 않는다고 대답하고 대답을 downvoting하는 것은 유치한 것입니다. –

+0

질문에 편집 내용이 설명되어 있으므로 콜백을 닫으면 클라이언트에 알리지 않습니다. 클라이언트가 오류 이벤트를 수신하도록 중지해야합니다. – Sentry