問題在於關於類中的靜態數據。在IIS中託管的WCF服務的生命週期
如果這是一個服務類,那麼我認爲實例化模式很重要。 但是如果我有另一個獨立的單例類,會發生什麼?
我可以在那裏創建一個可用於所有每通電話的對象嗎? IIS是否永遠在內存中有這個dll,這樣單例會一直在內存中?
如何讓一些對象可用於所有WCF客戶端調用?是否有可能在IIS中做到這一點,或者我應該在Windows服務中託管WCF服務?
問題在於關於類中的靜態數據。在IIS中託管的WCF服務的生命週期
如果這是一個服務類,那麼我認爲實例化模式很重要。 但是如果我有另一個獨立的單例類,會發生什麼?
我可以在那裏創建一個可用於所有每通電話的對象嗎? IIS是否永遠在內存中有這個dll,這樣單例會一直在內存中?
如何讓一些對象可用於所有WCF客戶端調用?是否有可能在IIS中做到這一點,或者我應該在Windows服務中託管WCF服務?
在我的本地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服務所能做的一切以及更多。
將提供基於短背景下一些提示您提供
如果你有一個靜態類,狀態,只要你有機會獲得同樣的WCF代理維護。主機(IIS或Windows服務)無關緊要。
如果您希望跨客戶端請求維護'全局靜態變量',爲什麼不將它們存儲在存儲庫(文件/數據庫/等)中?
如果您想保留每個客戶端請求的狀態,您可以試試看'耐用WCF服務'(related thread)。我之前已經使用過它 - 所以如果您的方案需要像行爲一樣的會話並意識到性能成本,它的確可以工作。
希望這會有所幫助。
我沒有得到第一點(你究竟是什麼意思:同樣的wcf代理?)第二點,因爲我想從db加載一些數據並將其提供給客戶端(速度是相關的)。另一方面,據我所知,使用cookie來存儲客戶端的會話數據。因此,在Windows服務中託管一個wcf是正確的選擇? – John
@John - 第一點,'WCF proxy'是指在客戶端創建的訪問服務的對象。所以假設你使用一個WCF代理來進行一些服務調用,靜態類(在服務器端)將保持不變。除非服務電話是相關的,否則我不會建議。關於第二個問題,我喜歡使用Windows服務來維護全局變量的想法。以前沒有用過,但試試看。 – Channs
我明白知道。謝謝你的建議。 – John