2012-12-13 184 views
2

我有一個託管WCF服務的Windows服務,該服務向多個客戶端廣播信息。我想優雅地處理來自客戶端的服務關閉,即檢測服務已經消失或想要關閉,彈出消息並關閉應用程序。目前,如果我關閉該服務,我會得到以下結果。在Windows服務中託管的WCF雙工會話中處理服務關閉

「ServiceHost的關閉操作00後超時:00: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

的解決方案是增加一個「取消訂閱」方法的回調接口。然後客戶可以退訂。 因此,當服務停止時,它會要求客戶端斷開連接。

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

在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 

,並在客戶端上

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

End Sub 
相關問題