2

我有一个托管 WCF 服务的 Windows 服务,该服务向多个客户端广播信息。我想从客户端优雅地处理服务关闭,即检测到服务已经消失或想要关闭,弹出一条消息并关闭应用程序。目前,如果我在关闭行关闭服务,我会得到以下信息。

“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

结束类

4

1 回答 1

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
于 2012-12-17T20:00:44.163 回答