2012-05-02 4 views
3

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

私のクライアントでは、ChannelFactoryを使用して2つのプロキシを作成します。 PROXY2で

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

、私は再びこの時間を除いて、私はDispose()をキャストし、起動していない、MyMethod()操作を3回呼び出します。PROXY1に私はPROXY1を配置するための数行のコードを持って、その後、MyMethod()操作を3回呼び出します。私は、サーバー/クライアントを実行すると、私が手に同じトレース6回:

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

私の質問は次のとおりです。最初の3つのトレースだけを使用していても、いつもトレースのDispose()部分が毎回発生するのはなぜですか?私の推測では、BasicHttpBindingを使用するときにセッション管理自体がないため、古いリソースがまだ残っていて、古いDispose()呼び出しを印刷するという事実と関係していると思います。

事前にご提供いただいている洞察をお寄せいただきありがとうございます。 :)

答えて

3

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

サーバーの場合、各サービスオブジェクトの有効期間は、ServiceBehaviourInstanceContextModeによって制御されます。これをPerCallに設定すると、サービスクラスの新しいインスタンスが作成され、呼び出しごとに破棄されます。 WCFはあなたのためにこれを行います - ちょうどServiceBehaviourを設定してください。

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

+0

あなたの迅速で洞察力のある応答に感謝します!間違いなく私の質問に100%答えました。 :D –

+0

あなたは大歓迎です:) –

0

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

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

関連する問題