3

私は .NET Web サービス入門コースを受講していますが、現在学んでいることの 1 つは IDisposable インターフェイスです。比較的単純な例として、オペレーションを使用してサービス (サーバー/クライアント) を作成しましたMyMethod()。このメソッドは、呼び出されたときに trace ステートメントを出力するだけです。また、サーバーに IDisposable を実装Dispose()し、サーバー実装バージョンで単純な WriteLine トレースを使用してメソッドを実装しました。

私のクライアントでは、ChannelFactory を使用して 2 つのプロキシを作成します。proxy1 でMyMethod()操作を 3 回呼び出してから、proxy1 を破棄するための数行のコードを記述します。

var castedProxy = (IDisposable)proxy1;
castedProxy.Dispose();

proxy2 で、もう一度MyMethod()操作を 3 回呼び出します。ただし、今回はキャストも呼び出しもしませんDispose()。サーバー/クライアントを実行すると、同じトレースが 6 回表示されます。

サーバーのトレース + CurrentThread ID
MyMethod() のトレース + CurrentThread ID
Dispose() のトレース + CurrentThread ID

私の質問は次のとおりDispose()です。最初の 3 つのトレースのみを使用しているにもかかわらず、トレースの一部が毎回発生するのはなぜですか? 私の推測では、BasicHttpBinding を使用する場合、セッション管理自体がないため、古いリソースがまだ存在し、古い Dispose() 呼び出しを出力しているという事実と関係があると思います。

あなたが提供できる洞察を前もって感謝します!:)

4

2 に答える 2

3

クライアント上のプロキシとサーバー上のサービスは、2 つの別個のオブジェクトです。

サーバーの場合、各サービス オブジェクトの有効期間は の によって制御されInstanceContextModeますServiceBehaviour。これが に設定されているPerCall場合、サービス クラスの新しいインスタンスが作成され、呼び出しごとに破棄されます。ServiceBehaviourWCF がこれを行います。.

通常、クライアントとサーバーは異なるプロセスにあります。そのように考えると、クライアント プロキシの有効期間がサービスの有効期間を制御しないことは理にかなっています。

于 2012-05-02T18:09:53.477 に答える
0

サーバーではなく、クライアントで dispose を呼び出します。WCF サービスは要求ごとに構成されているため、クライアントがまだ存在する場合でも、呼び出しごとにクラスが作成されて破棄されます。

Dispose in サービスは、既定で WCF によって呼び出されます。これは正常な動作です。サービスが を実装しIDisposableているDispose場合、サービスが破棄されたときに呼び出されます。

于 2012-05-02T18:09:39.257 に答える