我正在运行一个MVC4 asp.net应用程序,它处理app文件夹中的create / delete文件夹。
当应用创建或删除文件夹时会话停留。
但是当应用创建一个文件夹然后一个接一个地删除时,会话就丢失了。
我已将此片段放在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[] { });
有没有办法解决这个问题而不将文件夹位置移到app文件夹之外?
答案 0 :(得分:2)
如果您修改bin子文件夹中的任何内容,应用程序将被回收,这将导致InProc会话丢失。
如果您创建/删除bin以外的文件夹,我不希望应用程序被回收,但您可以通过向Application_End添加trace语句来轻松检查。如果触发此事件,您的应用程序将被回收。
修改bin目录后的应用程序回收是设计使然,我不会通过反映私有ASP.NET方法来干扰它。
您可以尝试使用out-proc SessionState模式(StateServer或SQLServer)
答案 1 :(得分:1)
也许你可以将你的会话放在数据库中,这样可以使它保持活力。
“为ASP.NET SQL Server会话状态配置SQL Server”http://support.microsoft.com/kb/317604
编辑:对于Windows Azure,我会选择Windows Azure Cache。请参阅:http://msdn.microsoft.com/en-us/library/windowsazure/gg185668.aspx和https://www.simple-talk.com/cloud/platform-as-a-service/managing-session-state-in-windows-azure-what-are-the-options/我认为不会因回收应用程序而受到影响。
或者对于更通用的解决方案,使用Microsoft ASP.NET Universal Providers可以使用:http://www.nuget.org/packages/Microsoft.AspNet.Providers