2011-11-14 77 views
2

我有一個在IIS上運行的WCF服務。WCF服務和單身人士

每次用戶登錄(使用用戶名和密碼)時,我都會創建一個SessionClass,它在線程中每隔幾分鐘執行一次操作並處理用戶請求。

我保存每個在單例ServiceClass中的字典中創建的新SessionClass。

如果用戶長時間沒有請求任何東西(比如說10個小時),則會話將會消失。我終止線程並從ServiceClass單例中的字典中刪除SessionClass。

我的問題是,每次我從Dictionary中刪除一個SessionClass時,它都會使ServiceClass的實例再次爲null,並在下一次被調用時再次創建,所以我失去了我用來保存的所有會話我試過拿着WCF服務中直接引用ServiceClass.GetInstance()的字典...

(我認爲垃圾收集器查殺服務類),但它不會幫助...

這是爲什麼發生?有任何想法嗎?

+0

閱讀更多關於它[這裏](http://msdn.microsoft.com/en-us/library/ms731193.aspx)。 – CodeCaster

回答

1

將您的詞典聲明爲靜態字段。至於爲什麼這是目前發生的事情,不可能說沒有更多的信息,請張貼一些代碼。

更新
基於您的評論,它聽起來就像是IIS的循環的競爭和應用程序池/或應用程序域。無論哪種情況,您的AppDomain都會被卸載,因此存儲在內存中的所有信息都將丟失。

苔絲Ferrandez寫了一篇很好的博客文章爲什麼IIS做到這一點here

更新2
如果它只是不方便的數據丟失,你可以嘗試託管服務爲managed windows service代替。受託管的Windows服務託管選項啓用的方案是在IIS外部託管的長時間運行的WCF服務,該服務未在消息激活的安全環境中進行。服務的生命週期由操作系統控制。但是,如果你的數據永遠不會丟失至關重要,那麼你需要添加一個持久化機制(數據庫,存儲在磁盤上的一個文件等)並從那裏讀取/寫入。

+0

我宣佈字典爲靜態,但它仍然沒有幫助。 這裏是該類: '公共類ServiceClass { 私人靜態ServiceManager _instance; private static Dictionary _sessions = new Dictionary (); 私人服務類(){ } 公共靜態服務類的GetInstance(){ 回報 _instance? (_instance = new ServiceClass()); } }' – YogevSitton

+0

hemmm ...聽起來像是這個原因。我更改了我正在使用的AppPool在IIS上的回收設置。有什麼方法可以確保AppPool永遠不會回收?如果不是 - 我的選擇是什麼?我怎樣才能確保不會丟失信息? – YogevSitton