2010-01-22 47 views
1

我正在使用IIS託管我的WCF應用程序。爲了服務某些方法,我需要一個對大量初始化的幫助對象的引用。一個好的方案是初始化一次並放入緩存中,然後所有請求只使用緩存中的對象。我如何做緩存?在不同服務主機中啓動的wcf服務的常見緩存

最簡單的方法是使用mywebmethod的靜態字段。 IIS創建多個ServiceHosts來爲請求提供服務。並且在每個servicehost中,靜態字段將會不同。

我aso嘗試使用System.Web.HttpRuntime.Cache。同樣,我有一些獨立的緩存。爲了澄清,我需要不緩存請求的結果,但需要處理請求的一些中間數據。

那麼有什麼解決方案?

+0

我發現IIS的真正問題不在不同的服務主機中。他們可以通過HttpContext.Cache屬性成功共享System.Web.Caching.Cache對象(至少適用於httpBindings)。 .Net爲每個AppDomain創建一個Cache對象。如果IIS在AppPool中使用多個工作進程(在IIS 7中默認爲10),它顯然會自然創建100個AppDomain和10個單獨的緩存。 – flashnik 2010-01-26 10:42:04

回答

1

在單獨的AppDomain中運行不同的服務可爲您提供崩潰保護和其他一些與安全相關的好處。如果您確定需要共享靜態,請考慮使用自託管服務。

我只能想到使用IIS實現此目的的一種方法:實現一個ServiceHostFactory,它將返回將啓動和停止多個ServiceHosts的自定義ServiceHost。但waaay太hacky是一塊生產代碼)

更新我今天偶然發現了這個,這個答案看起來像一團糟。如果不同的服務主機駐留在同一個IIS站點中,它們共享一個AppDomain,因此所有服務的靜態字段應該相同。

+0

運行多個服務主機是否會帶來性能優勢? – flashnik 2010-01-22 15:39:59

+0

不,它只是把它們放到同一個appdomain中的一個棘手的方法,甚至不能確定你能夠創建一個虛假的服務主機來封裝它們。 再次,我會選擇一個自我託管的選項。 – 2010-01-22 15:45:55

+0

有一件事讓我無法運行自我託管的潛在性能損失,因爲只有一個服務主機,因此與IIS中的幾個servicehosta相比。 – flashnik 2010-01-22 15:48:47