2014-06-25 2 views
1

콜백을 사용하여 WCF 서비스를받을 수있었습니다. 클라이언트는 단순히 서비스에 "가입"하고 서비스는 타이머를 시작합니다. 이 타이머는 콜백 함수를 호출 할시기를 결정합니다.WCF 서비스 구독 취소 방법

지금 내 질문은 클라이언트를 단순히 폐쇄 클라이언트 CommunicationException 발생합니다 때문에 구독 취소하는 방법입니다.

내 구현은 Unsubscribe()이며 올바른 타이머를 사용하지 않도록 설정 했습니까? 아니면 추가 단계를 수행해야합니까? 귀하의 경우에는

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerSession)] 
internal class HostFunctions : IHostFunctions 
{ 
    private static ILog _log = LogManager.GetLogger(typeof(HostFunctions)); 
    private IHostFunctionsCallback _callback; 
    private Timer _timer; 

    #region Implementation of IHostFunctions 

    public void Subscribe() 
    { 
     _callback = OperationContext.Current.GetCallbackChannel<IHostFunctionsCallback>(); 
     _timer = new Timer(1000); 
     _timer.Elapsed += OnTimerElapsed; 
     _timer.Enabled = true; 
    } 

    public void Unsubscribe() 
    { 
     _timer.Enabled = false; 
    } 

    private void OnTimerElapsed(object sender, ElapsedEventArgs e) 
    { 
     if (_callback == null) return; 
     try 
     { 
      _callback.OnCallback(); 
     } 
     catch (CommunicationException comEx) 
     { 
      // Log: Client was closed or has crashed 
      _timer.Enabled = false; 
     } 
    } 

    #endregion 
} 

답변

1

, 당신은 추가 단계를 수행 할 필요가 없습니다

여기 내 서비스 클래스입니다. 클라이언트가 각각 자신의 서비스 인스턴스를 얻으므로 클라이언트 채널이 닫힐 때 콜백 채널이 범위를 벗어납니다. (참고 : 서비스 인스턴스 모드가 세션 당이기 때문에이 경우입니다.)

클라이언트의 클라이언트 채널에서 Close()를 호출하면 모든 것이 서비스 끝에서 범위를 벗어납니다. 올바른 방법으로 채널을 폐쇄하는 것을 잊지 마세요 :

try 
{ 
    channel.Close(); 
} 
catch 
{ 
    channel.Abort(); 
    throw; 
} 

어느 쪽이든 또는 서비스에 대한 대기 초과하는 수신 시간 후 세션이 종료되고 채널이 범위를 벗어나 이동합니다. 그러나 서비스가 서버의 메모리에 오래 유지되므로 이는 약간 낭비입니다.

참고 : 서비스 끝에서 콜백 채널에 대해 Close/Dispose를 호출 할 필요는 없습니다.

+0

그리고 클라이언트가 충돌하거나 프로세스가 종료되면 어떻게됩니까? 이 경우 클라이언트는 연결을 닫을 수 없습니다. –

+0

그러면 클라이언트 채널이 결국 시간 초과되어 닫힙니다. –