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

解決策は、「Unsubscribe」メソッドをコールバック インターフェイスに追加することです。その後、クライアントは購読を解除できます。そのため、サービスが停止すると、クライアントに切断するように求められます。

   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 に答える