2

短いバージョン: 二重通信を使用するクライアントで ChannelFactory を使用してチャネルを作成した場合、コールバックを受信するためにチャネルを開いたままにしておく必要がありますか、それとも ChannelFactory.Close() を呼び出すことができますか?

長いバージョン: 私は最初の WCF サービスを開発しており、独自の ClientProxy クラスを作成しました。これは、いくつかの異なるサービスを実装して 1 つに統合します。私は ChannelFactory を使用して各チャネルを作成しています。ネットでの一般的な読み取りでは、ChannelFactory をキャッシュする必要があることが示されていますが、実際のチャネルは必要な場合にのみ開いたり閉じたりする必要があります。

そこで、ChannelFactory.Open を呼び出してチャネルを開き、双方向操作 (後でコールバックを呼び出す一方向操作) を実行します。操作を要求した後で ChannelFactory.Close を呼び出してこのチャネルを閉じる必要がありますか? その場合でもコールバックを受け取りますか?

基本的なテストでは、接続を閉じるとコールバックを受け取ることが示されているようですが、確認したいだけです。また、ChannelFactory をキャッシュするこの方法は正しいですか?

ありがとう

4

1 に答える 1

4

コールバックを受信したい間はクライアント側のプロキシを開いたままにしておき、完了したらチャネルを閉じる必要があります。

これは、Juval Lowy による素晴らしい本 Programming WCF Services からの引用です (コールバックに関する章全体を読むことをお勧めします)。

5.3.4. コールバック接続管理

コールバック メカニズムは、サービスとコールバック エンドポイント間の接続を管理するための上位レベルのプロトコルのようなものを提供しません。アプリケーション レベルのプロトコルや、接続のライフ サイクルを管理するための一貫したパターンを考え出すのは、開発者次第です。前述のように、サービスは、クライアント側のチャネルがまだ開いている場合にのみ、クライアントにコールバックできます。これは通常、プロキシを閉じないことによって行われます。プロキシを開いたままにしておくと、コールバック オブジェクトのガベージ コレクションも防止されます。サービスがコールバック エンドポイントで参照を維持し、クライアント側のプロキシが閉じられているか、クライアント アプリケーション自体がなくなっている場合、サービスがコールバックを呼び出すと、サービス チャネルから ObjectDisposedException が取得されます。したがって、クライアントがコールバックを受信する必要がなくなったとき、またはクライアント アプリケーションがシャットダウンしているときに、サービスに通知することをお勧めします。そのために、明示的な Disconnect( ) メソッドをサービス コントラクトに追加できます。すべてのメソッド呼び出しにはコールバック リファレンスが含まれているため、Disconnect( ) メソッドでは、サービスは内部ストアからコールバック リファレンスを削除できます。

于 2008-12-26T19:21:21.330 に答える