【问题标题】:Saving contents of ApplicationState in ASP.Net (MVC)在 ASP.Net (MVC) 中保存 ApplicationState 的内容
【发布时间】:2026-01-13 01:45:02
【问题描述】:

我有一个用于编辑磁盘上的 XML 文件的内部应用程序。 XML 文件被加载到存储在 ApplicationState 中的对象模型中。

我需要保存这些数据。一种选择是每次用户更改某些数据时都执行此操作。但是,这似乎有点低效 - 每次进行更改时都将数据写入磁盘。

相反,是否可以在用户关闭浏览器时以及在 Web 服务器退出之前收到通知?因此,数据将在每次会话结束时保存,加上计算机关闭时等。我认为 Global.asax 中的 Application_End()、Application_Error() 和 Session_End() 会提供这个,但这些方法没有似乎被调用了。

【问题讨论】:

    标签: c# asp.net-mvc application-state


    【解决方案1】:

    Session_End 应该被调用。

    您在哪个版本的 IIS 上运行,或者您在 Visual Studio 开发服务器中托管?

    让 Session_End 触发的步骤:

    1. 在 VS 2008 中创建一个新网站

    2. 编辑 web.config:

      <sessionState mode="InProc" cookieless="true" timeout="1"/> 添加到<system.web>

    3. 使用如下所示的代码添加一个 Global.asax 文件。

      void Session_End(object sender, EventArgs e)

      {

      Console.WriteLine( "Session_End" );

      }

    4. Console.WriteLine 调用上设置断点。

    5. 按 F5 并在 IE 或 Firefox 中查看页面加载情况。

    6. 等待 1 分钟左右。

    7. 断点应在 IDE 中以红色突出显示。

    【讨论】:

    • 请注意,Session_End 仅在使用 InProc 会话管理时调用,如果应用程序因任何原因重新启动,则根本不会调用,因此并不那么可靠。
    • 如果应用程序重新启动,您可能有机会在 Application_End 方法中进行保存。
    • 正如 Zhaph 指出的那样:仅当 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 或 SQLServer,则不会引发事件。
    • 如果这些更改很重要,请记住,如果服务器发生硬故障(例如断电、导致应用程序无响应的错误),增加写入磁盘的延迟也会增加丢失这些更改的风险等)。