2012-05-02 29 views
3

我正在介紹.NET Web服務課程,目前我們正在學習的其中一個內容是IDisposable接口。作爲一個相對簡單的例子,我創建了一個具有MyMethod()操作的服務(服務器/客戶端)。該方法在調用時僅打印一條跟蹤語句。我還在我的服務器上實現了IDisposable,實現了Dispose()方法,並且在服務器實現版本中使用了簡單的WriteLine跟蹤。即使我不調用它,爲什麼我的服務的Dispose()方法被調用? (使用BasicHttpBinding)

在我的客戶,我創建了兩個代理用的ChannelFactory。在PROXY1我調用MyMethod()操作3次,然後有幾行代碼用於處置PROXY1:

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

在Proxy2發出,我再次調用MyMethod()操作3次,但這次我不投,並調用Dispose() 。當我運行的服務器/客戶端,我得到了相同的軌跡6次:

服務器的跟蹤+ CurrentThread ID
的MyMethod()的跟蹤+ CurrentThread ID
的Dispose()的跟蹤+ CurrentThread ID

我的問題是這樣的:爲什麼每次都會發生跟蹤的部分,即使我只使用前3條跟蹤?我的猜測是,這與使用BasicHttpBinding時本身沒有會話管理的事實有關,因此舊的資源仍然存在,打印舊的Dispose()調用。

在此先感謝您提供的任何見解! :)

回答

3

您的客戶端代理和服務器上的服務是兩個不同的對象。

對於服務器,每個服務對象的生存期由ServiceBehaviourInstanceContextMode控制。如果這設置爲PerCall,那麼將爲每個調用創建並銷燬服務類的新實例。 WCF爲你做這個 - 你只需要設置ServiceBehaviour

通常情況下,客戶端和服務器將在不同的進程。如果你這樣想,那麼客戶端代理的生命週期不能控制服務的生命週期是有意義的。

+0

感謝您的快速和富有洞察力的迴應!絕對回答我的問題100%。 :D –

+0

不客氣Chris :) –

0

您可以在客戶端而不是服務器上調用dispose。由於您的WCF服務按每個請求進行配置,因此即使客戶端仍然存在,該類也將爲每次調用創建並處理。

WCF默認調用服務中的Dispose。這是正常的行爲。如果服務實現IDisposable,則在服務被銷燬時調用Dispose

相關問題