2013-11-29 40 views
3

我正在運行MVC4 asp.net應用程序,它處理應用程序文件夾內的創建/刪除文件夾。創建和刪除文件夾時MVC會話丟失

會話保持應用程序創建或刪除文件夾。

但是,當應用程序創建一個文件夾,然後刪除一個接一個,會話丟失。

我有地方這個片段在Global.asax中的決心維護會話,甚至有在內部應用程序的物理文件夾的變化:

PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", indingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); 
object o = p.GetValue(null, null); 
FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase); 
object monitor = f.GetValue(o); 
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic); 
m.Invoke(monitor, new object[] { }); 

有什麼辦法解決這一問題,而無需移動文件夾應用程序文件夾外的位置?

+0

有一個在.NET 4.5.1,打破你的文件監控的變化。所以,無論何時添加或刪除文件夾,您的ApplicationPool都將重新啓動。因此,你的會議不見了。只是一點點背景。 – dkoch74

回答

1

也許你可以把你的會話放在數據庫中,這樣可以保持活動狀態。

「SQL Server配置爲ASP.NET SQL Server會話狀態」 http://support.microsoft.com/kb/317604

編輯:對於Windows Azure的,我會去爲Windows Azure緩存。參考:http://msdn.microsoft.com/en-us/library/windowsazure/gg185668.aspxhttps://www.simple-talk.com/cloud/platform-as-a-service/managing-session-state-in-windows-azure-what-are-the-options/我相信這不會受到回收應用程序的影響。

或者一個更通用的解決方案,這使用Microsoft ASP.NET通用提供商可能的工作:http://www.nuget.org/packages/Microsoft.AspNet.Providers

+0

系統可能部署在Azure環境中,並且在Azure中將SQLServer用作sesstionState模式時存在缺陷,並且一個原因是Microsoft不支持使用SQL Azure數據庫進行ASP.net應用程序的SQL會話狀態管理。 – evilom

+0

@evilom查看我更新的答案。 – cederlof

1

如果修改了bin子文件夾裏的任何東西,應用程序將被回收,這將導致InProc會話是丟失。

如果您創建/刪除bin以外的文件夾,我不希望應用程序被回收,但您可以通過向Application_End添加trace語句來輕鬆檢查該應用程序。如果此事件被解僱,您的申請將被回收。

對bin目錄進行修改後的應用程序回收是有意設計的,我不會試圖通過反射私有ASP.NET方法來干擾它。

你可以嘗試使用了進程內SessionState的模式(StateServer的或SQLServer的)