最簡單的辦法就是不要使用預設的方式也即
InProc(預設,進程內的工作階段狀態):Session儲存在IIS進程中(Web伺服器記憶體)。如果使用的是Windows 2000 Server或Windows XP,IIS使用aspnet_wp.exe進程,如果使用的是Windows 2003 Server,IIS使用w3wp.exe。
InProc擁有最好的效能。但進程內Session很容易丟失Session資訊。如果重啟了應用程式,所有的Session資訊就會丟失。而很多原因 都會導致ASP.NET應用程式的重啟。
修改了Web.Config或Global.asax檔案,或改變了檔案的修改日期。
修改了\bin或\App_Code目錄裡的檔案。
防毒軟體修改了上述檔案等等
你可以考慮以下兩種方式
1、StateServer(進程外的工作階段狀態):Session儲存在獨立的 Windows服務進程aspnet_state.exe中
如果要啟用StateServer中的Session狀態,首先要在”控制台”--“管理工具”--“服務”中,啟用ASP.NET State Services(ASP.NET 狀態服務),並將此服務設定為Automatic(自動啟動)
啟動ASP.NET狀態服務後,需要配置ASP.NET應用程式來使用它。
我們需要在Web.Config檔案中system.web節點中添加如下代碼
<sessionState mode="StateServer" stateNetworkTimeout="20"
stateConnectionString="tcpip=127.0.0.1:42424" />
首先,mode屬性被設為StateServer。接著,stateConnectionString屬性用來指定ASP.NET狀態伺服器端的位置。連 接位置被建立為在127.0.0.1,連接埠42424。最後,stateNetworkTimeout屬性用來指定連線逾時的秒數。
需要注意的是,此時必須把對象標註為可序列化後(使用Serializable特性標記需要序列化的類)才能在服務中進行儲存。Microsoft建議所 有的開發人員在開發過程中都使用進程外的工作階段狀態,以避免項目如果切換到其他進程外的提供者或SqlServer而導致網站的錯誤。
或者使用
2、SqlServer:Session儲存在SqlServer資料庫的表中,可以用 aspnet_regsql.exe配置它(SqlServer伺服器)
還一種辦法是釆用虛擬目錄的方法:
前提是你有再 web(專案檔夾)網站下建立虛擬目錄的許可權,並且可以將虛擬目錄指定到web檔案夾外部
比如應用程式的上傳檔案夾是/Uploadfiles,那麼需要在IIS中給web網站下面建立一個Uploadfiles虛擬目錄,並指向web檔案夾 外部的另一個檔案夾。
並且刪除web下面的uploadfiles物理目錄
這樣子就可以繞過修改web檔案結構而引起session丟失的問題,實現刪除檔案夾而不會引起應用程 序重啟