2012-12-13 2 views
2

정보를 여러 클라이언트에 브로드 캐스팅하는 WCF 서비스를 호스팅하는 Windows 서비스가 있습니다. 클라이언트에서 서비스 종료를 정상적으로 처리하고 싶습니다. 즉, 서비스가 사라 졌거나 닫고 메시지를 팝업하고 응용 프로그램을 닫으려는 것을 감지하고 싶습니다. 현재 가까운 전화선에서 서비스를 종료하면 다음과 같은 결과를 얻습니다.Windows 서비스에서 호스팅되는 WCF 이중 세션의 서비스 종료 처리

": 00 : ServiceHost를 닫기 작업이 00 후 시간이 초과되었습니다. 클라이언트가 필요한 시간 내에 sessionful 채널을 닫 실패했기 때문에 09.9910000이 될 수 있습니다."

질문 : 나는 가까운 요청을 감지하려면 어떻게해야하고 클라이언트를 닫으시겠습니까?

서비스가 내가 얻을 클라이언트에서 닫힌 후

여기에 가까운 코드 "소켓 예외는 기존 연결이 원격 호스트에 의해 강제로 끊겼습니다 발생했습니다." 여기

If Not (_LivePricingHost Is Nothing) Then 
    _LivePricingHost.Close() 
    _LivePricingHost = Nothing 
End If 

내가 상용구 코드와 나는 클라이언트까지 제기하고있는 이벤트를 폐기 제거, 나는이 이중 세션을 설정하는 데 사용하는 클래스입니다.

Imports System.ServiceModel 

Public Class NotificationCallback 
    ' Implements LivePricingService.IMessageCallback 
    Implements IDisposable 

    Private _ns As LivePricingService.MessageClient 

    Public Sub New() 
     Dim context = New InstanceContext(Me) 

     _ns = New LivePricingService.MessageClient(context) 
     _ns.SubscribeForBroadcast() 
     ' _ns.AddMessage("PING") 
    End Sub 

#End Region 

최종 클래스

답변

1

솔루션은 콜백 인터페이스에 "탈퇴"방법을 추가하는 것입니다. 그런 다음 클라이언트가 수신 거부 할 수 있습니다. 그래서 서비스가 중지되면 클라이언트에게 연결을 끊도록 요청합니다. WCF 서비스

Public Sub UnsubscribeAll() 
     Try 
      RemoveClosedSubscribers() 

      For Each callback As IMessageCallback In _subscribers 
       If DirectCast(callback, ICommunicationObject).State = CommunicationState.Opened Then 
        callback.ShutDown() 'request that the client disconnect 
        _subscribers.Remove(callback) 
       End If 
      Next 
     Catch ex As Exception 
      Logging.Logger.LogMessage(ex:=) 
     End Try 
    End Sub 

에 클라이언트에

Protected Overrides Sub OnStop() 
     pollTimer.Stop() 
     _LivePricingWCFService.UnsubscribeAll() 
     If Not (_LivePricingHost Is Nothing) Then 
      _LivePricingHost.Close() 
      _LivePricingHost = Nothing 
     End If 
    End Sub 

Public Sub ShutDown() Implements LivePricingService.IMessageCallback.ShutDown 
    _ns.Close() 
    Globals.LastException = New Exception("The Live Pricing Serice has shut down.") 

End Sub 
관련 문제