2012-06-13 59 views
5

問題在於關於類中的靜態數據。在IIS中託管的WCF服務的生命週期

如果這是一個服務類,那麼我認爲實例化模式很重要。 但是如果我有另一個獨立的單例類,會發生什麼?

我可以在那裏創建一個可用於所有每通電話的對象嗎? IIS是否永遠在內存中有這個dll,這樣單例會一直在內存中?

如何讓一些對象可用於所有WCF客戶端調用?是否有可能在IIS中做到這一點,或者我應該在Windows服務中託管WCF服務?

回答

2

在我的本地IIS中檢查問題。

這是我的代碼。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 

    public static int _counter = 0; 

    public string GetData() 
    { 
     _counter++; 
     return _counter.ToString(); 
    } 
} 

在默認的IIS配置一個過程每個應用程序運行的拉動,這代碼按預期工作。每次服務呼叫都會增加結果。

這很有道理,因爲InstanceContextMode不管理線程。它僅控制生命週期的壽命。

知道我們仍然不能考慮使用可變數據的靜態變量作爲最佳實踐。 IIS可以配置爲「Web Garden」。該配置意味着每個應用程序池允許多個工作進程,每個進程都有自己的靜態變量副本。

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools

我怎樣才能讓某個對象是提供給所有WCF客戶端調用? 是否有可能在IIS中執行此操作,或者我應該在 Windows服務中託管WCF服務?

對象應存儲在持久性存儲中,如數據庫或分佈式緩存。 IIS仍然是一個偉大的服務主機,它提供了Windows服務所能做的一切以及更多。

2

將提供基於短背景下一些提示您提供

  • 如果你有一個靜態類,狀態,只要你有機會獲得同樣的WCF代理維護。主機(IIS或Windows服務)無關緊要。

  • 如果您希望跨客戶端請求維護'全局靜態變量',爲什麼不將它們存儲在存儲庫(文件/數據庫/等)中?

  • 如果您想保留每個客戶端請求的狀態,您可以試試看'耐用WCF服務'(related thread)。我之前已經使用過它 - 所以如果您的方案需要像行爲一樣的會話並意識到性能成本,它的確可以工作。

希望這會有所幫助。

+0

我沒有得到第一點(你究竟是什麼意思:同樣的wcf代理?)第二點,因爲我想從db加載一些數據並將其提供給客戶端(速度是相關的)。另一方面,據我所知,使用cookie來存儲客戶端的會話數據。因此,在Windows服務中託管一個wcf是正確的選擇? – John

+1

@John - 第一點,'WCF proxy'是指在客戶端創建的訪問服務的對象。所以假設你使用一個WCF代理來進行一些服務調用,靜態類(在服務器端)將保持不變。除非服務電話是相關的,否則我不會建議。關於第二個問題,我喜歡使用Windows服務來維護全局變量的想法。以前沒有用過,但試試看。 – Channs

+0

我明白知道。謝謝你的建議。 – John