2

たとえば、NetTcpBinding を使用して二重サービスを作成し、新しいクライアントによる新しいサブスクリプションごとに新しいセッションを発行/購読パターンとして作成するように構成されているとします。新しいクライアントが接続するたびに、新しいサービス インスタンスが作成されます。 . クライアントが切断したい場合はUnsubscribe()、セッションを終了するのに十分なメソッドを呼び出します。

また、クライアントがアクティブであるかどうかを確認するメソッドがサービスにあるとします。つまり、クライアントは定期的にこのメソッドを呼び出す必要があります。クライアントがアクティブでなくなったことをサービスが検出した場合、サービスがクライアントから切断することを決定するのは理にかなっています。クライアント。同様に、サービスをホストしているアプリケーションをユーザーが閉じることを決定した場合、サービスはすべてのセッションを終了することを決定する場合があります。

  • サービス側からセッションを終了するには?
  • クライアント (つまり、自動生成されたプロキシ) は、サービスが切断しようとしていること、または切断しようとしていることをどのように検出できますか? 例外をスローしますか?

アップデート

ICommunicationObjectインターフェイス、CommunicationObjectクラス、インターフェイスなどについて読んだIDisposableので、コールバックに関連するものを使用しようとしましICommunicationObjectた:

ICommunicationObject obj = (ICommunicationObject)callback;
obj.Close();

このようにして、セッション インスタンスはきれいに破棄され (Dispose()メソッドを呼び出した後にデストラクタ メソッドが呼び出されClose()ます)、クライアントがリクエストを送信しようとすると、その上で aProtocolExceptionが起動されます。

サーバーが開始したシャットダウンにより、出力セッションが自動的に閉じられたため、このチャネルを使用してメッセージを送信することはできなくなりました。DispatchRuntime.AutomaticInputSessionShutdown を false に設定して自動クローズを無効にするか、リモート サーバーでシャットダウン プロトコルを変更することを検討してください。

同様に、上記のコードを使用してAbort()メソッドを呼び出すと、サービス インスタンスが破棄さCommunicationObjectFaultedExceptionれ、クライアントで例外がスローされます。

通信オブジェクト System.ServiceModel.Channels.ServiceChannel は、Faulted 状態であるため、通信に使用できません。

私が得た動作はほとんど私が望んでいるものですが、これが正確な方法であるかどうかはわかりません。

4

1 に答える 1

2

非アクティブになっているセッションを閉じたい場合は、信頼できるセッション非アクティブタイムアウトhttp://msdn.microsoft.com/en-us/library/system.servicemodel.reliablesession.inactivitytimeout.aspxを使用すると、インフラストラクチャが自動的に閉じます。あなたのためのセッション。それ以外の場合、手動アプローチの場合は、OperationContext.Current.InstanceContext.Close()またはOperationContext.Current.InstanceContext.Abort()を試すことができます。

于 2012-06-27T18:11:22.590 に答える