2011-12-13 3 views
7

콜백/이중 통신 채널을 닫는 데 문제가 있거나 질문이 있습니다. 나는 다음을 검색 할 수WCF 콜백 인터페이스 - 누가 채널을 닫습니다.

OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>(); 

을 사용하여 서버 측에

DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea); 
IMyInterface myInterface = dcf.CreateChannel(); 

: 내가 통해 내 WCF 인터페이스를 만들 클라이언트 측에

[ServiceContract(CallbackContract = typeof(IMyInterfaceCallback))] 
public interface IMyInterface 
{ 
    [OperationContract] 
    void StartWork(); 
} 

public interface IMyInterfaceCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void WorkFeedback(); 
} 

: 여기 내 원형 WCF 인터페이스입니다 콜백 포인터는 클라이언트와 통신하는 데 사용될 수 있습니다.

내 질문은 지금 :

  1. 누구 통신 채널을 종료해야합니까? 클라이언트 또는 서버
  2. 어떤 통신 객체를 닫아야합니까? 원래 인터페이스 (IMyInterface) 또는 콜백 인터페이스 (IMyInterfaceCallback) 또는 둘 다.

서버가 더 이상 콜백을하지 않는다는 것을 알고있을 때 서버 측에서 콜백 인터페이스를 닫으려고했습니다. 그러나 콜백 인터페이스에서 ICommunicationObject :: Close를 사용하면 차단 작업이 1 분이 걸립니다.

내 의견으로는 클라이언트 쪽에서 마감하는 것이 올바른 방법이 아닙니다. 예상보다 많은 콜백이 있는지 클라이언트가 알지 못하기 때문입니다.

도움 주셔서 감사합니다. 프랭크

PS : 이것은 아주 기본적인 질문을 것 같다,하지만 ... 구글을 통해 또는 유래의 DuplexChannel은 후드 아래에 TCP 연결을 사용

답변

3

를 검색 할 때 지금까지 내가 더 도움이되는 정보를 찾을 수 없습니다, 이것이 양방향 통신을 에뮬레이트하는 방법입니다. 그러나 클라이언트는 항상 그 연결을 열어 놓기 때문에 TCP 연결을 닫을 책임이 있습니다 (TCP 소켓에서 생각하기). 따라서 클라이언트 인터페이스 IMyInterface (IClientChannel에서 파생 됨)를 사용하여 클라이언트 인터페이스를 닫아야합니다.

감사합니다. 파블로.

6

클라이언트는 (정상적으로) 서비스 채널을 닫아야합니다. GetCallbackChannel을 통해 획득

콜백 채널 (내이 관련 질문을 참조하십시오 : Do I need to Close and/or Dispose callback channels acquired through OperationContext.Current.GetCallbackChannel?를) 내 경험에 클로우즈되지 않는

채널은 당신이 선호하는 패턴을 사용한다 닫을 때 :

Try 
    channel.Close() 
Catch ex As Exception 
    channel.Abort() 
End Try 

때문에를 클라이언트는 (보통) 채널을 닫으려고 시도하는 동안 어떤 메시지가 아직 진행 중인지 알 수 없으므로 예외가 발생합니다.

+0

정보 주셔서 감사합니다. 이제 클라이언트 측의 채널을 닫고 모든 것이 정상입니다. 하지만 닫히기 전에 상태를 확인하고 있습니다. Faulted 인 경우 Abort()를 직접 호출합니다. 하지만 닫는 코드도 잘 작동해야합니다. – FrankE