2009-09-19 52 views
2

我知道,當它的主人W3WP進程回收,因爲它只是駐留在內存W3WP所有InProc會話數據總是不見了。保留ASP.NET InProc會話時W3WP(IIS)進程回收

我不知道但如果有可能,當談到備份緩存會話數據時發生的回收某處外部進程,然後重新注入(重建)會議。這樣我就可以在必要時獲得InProc的速度以及狀態服務器式外部化的可靠性。這可能嗎?

回答

2

不,這是不可能的。沒有API「加熱」進程內會話狀態或緩存。無論如何,這樣的解決方案都不可靠。您無法保證您的應用程序所做的最後一件事是導出其當前會話狀態,因此無論如何您都無法指望導入的數據爲當前狀態。

可以使用外的進程內的狀態服務器在同一臺主機作爲Web應用程序上。然後,Web應用程序可以自由回收,保持狀態信息不變。這比使用SQL Server管理會話要快很多,因爲您不必處理SQL或網絡傳輸到另一臺計算機的開銷,但它比進程內會話狀態更糟糕的唯一方式是數據必須在跨進程邊界進行編組,但只要您沒有大量快速變化的會話數據,則根本不應該引人注目。

也有其他的替代品,如Microsoft Project Code Named "Velocity"ScaleOut Software's SessionServer(其中包括我敢肯定),提供分佈式緩存機制,可以保持在服務器場中的服務器之間同步會話狀態或高速緩存,而不必訴諸使用SQL Server 。

相反的是其他用戶發佈的,我不會使用ViewState中存儲會話數據,如果在所有可能的。首先,它不是真正的會話狀態,如果用戶向前或向後移動,它可能會丟失。其次,這是相當不安全的。第三,如果被濫用,會導致大量的頁面膨脹。

0

也許你可以存儲在cookie(或在ViewState中)足夠的信息,以便基於該數據的情況下工作進程被回收,你可以重新創建一個會話。

或者你可以創建自己的狀態服務器(例如Windows服務),您存儲您的會話的一部分,並通過遠程或類似的從Web應用程序訪問此服務。

+0

這不起作用。最大Cookie大小約爲4k。 Cookie也是一種來回推送數據的非常低效且不安全的方式。 – 2009-09-21 20:54:10

+0

是的,但也許您只需要在該cookie中存儲一些ID(例如,用戶標識,當前頁面等),並且可以根據需要從數據庫恢復會話的其餘部分。 – M4N 2009-09-21 20:56:39

0

如果這是您的意圖,您應該使用SQL Server進行會話狀態。你想要的是可以從主機進程的完整結局中恢復的會話。無論是inproc還是stateserver都不支持它們,一旦它們停止,它們就會丟失所有數據。你可以寫你自己的狀態方法,但這會很費力。這裏的方向,如果你想這樣做:

http://www.exforsys.com/tutorials/asp.net-2.0/asp.net-2.0-customizing-the-session-state-mechanism.html

你可能想要做的是不使用會話所有,而是更多地依靠ViewState中。如果您擁有高流量網站,這是將工作負載推送給客戶端的好方法。

+0

用ViewState來擴展頁面來存儲會話信息不是一個好主意。 – 2009-09-21 21:19:20

+0

我有幾千個併發用戶的網站。對於高需求的網站,ViewState是減少服務器負載的好方法。 – 2009-09-21 21:21:23

+0

如果您真的閱讀我的文章,我不確定您的評論。 – 2009-09-21 21:22:22