【问题标题】:MVC session lost when creating and deleting folders创建和删除文件夹时 MVC 会话丢失
【发布时间】:2013-11-30 03:25:14
【问题描述】:

我正在运行一个 MVC4 asp.net 应用程序,它处理应用程序文件夹内的创建/删除文件夹。

当应用创建或删除文件夹时会话保持不变。

但是当应用创建一个文件夹然后一个又一个删除时会话丢失了。

我已将此 sn-p 放在 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[] { });

有没有什么办法可以在不将文件夹位置移到应用文件夹之外的情况下解决这个问题?

【问题讨论】:

  • .NET 4.5.1 中的更改会破坏您的文件监控。因此,无论何时添加或删除文件夹,您的 ApplicationPool 都会重新启动。因此,您的会话消失了。只是一点背景。

标签: c# asp.net .net asp.net-mvc session


【解决方案1】:

如果您修改 bin 子文件夹中的任何内容,应用程序将被回收,这将导致 InProc 会话丢失。

如果您创建/删除 bin 以外的文件夹,我不希望应用程序被回收,但您可以通过向 Application_End 添加跟踪语句轻松检查这一点。如果触发此事件,则您的应用程序正在被回收。

修改 bin 目录后的应用程序回收是设计使然,我不会试图通过反映私有 ASP.NET 方法来干扰它。

您可以尝试使用 out-proc SessionState 模式(StateServer 或 SQLServer)

【讨论】:

    【解决方案2】:

    也许您可以将会话放入数据库中,这样可以使其保持活动状态。

    “为 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.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

    【讨论】:

    • 系统可能部署在 Azure 环境中,在 Azure 中使用 SQLServer 作为 sesstionState 模式存在缺点,一个是 Microsoft 不支持使用 SQL Azure 数据库进行 SQL 会话状态管理 ASP.net应用程序。
    猜你喜欢
    • 2011-11-08
    • 2023-03-28
    • 2012-05-31
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2012-10-18
    • 2013-07-30
    相关资源
    最近更新 更多