Session_OnEnd behavior

本文关键字:behavior OnEnd Session | 更新日期: 2023-09-27 18:35:08

嗨,我对 asp.net SESSIONS的工作原理不是很熟悉,但经过一些阅读,我发现它可以帮助我解决一个不费吹灰之力的问题。

我的问题与允许用户在服务器上上传某些文档但在按下发布按钮之前不会实际将它们保存在数据库中的情况有关。

如果他上传文档并关闭浏览器,文档将保留在文件系统上,并且无法知道那里保存了哪些文档。

为了解决这个问题,我决定将文档的详细信息存储在会话中,而不是保存在文件系统上的实际文档。

当页面首次加载时,将根据会话中存储的数据执行文件系统的清理。

现在唯一剩下的就是能够处理用户关闭浏览器和会话同时过期的情况。

经过一番研究,我发现当会话过期时即使浏览器关闭Session_OnEnd方法是符文,所以我在这里添加了我的代码:

 public void Session_OnEnd()
 {
    var session = Session[Constants.FILE_SHARE_DOCUMENT];
    if (session != null)
    {
        var documents = (List<Document>)session;
        foreach (var document in documents)
        {
            string filePath = Path.Combine(Constants.SERVER_PATH, document.StorageFileName);
            File.Delete(filePath);
        }
    }
}

我还将会话结束设置为 1 分钟,它似乎在我尝试过的所有情况下都有效。

谁能确认这是否是解决我问题的可靠方法?

我缺少什么吗?

Session_OnEnd behavior

由于多种原因,这不是一个可靠的机制。

首先,将会话设置为 1 分钟? 那不是很长..您真的希望暂停一分钟的用户结束其会话吗? 您的意思是将其设置为 1 分钟以进行测试吗? 通常,会话超时更像是 20 分钟。

其次,在回收工作进程的情况下,不会调用Session_End。 如果工作进程崩溃、设置为按计划回收或手动回收,则可能是这样。

我只会让您的清理过程删除时间戳大于特定时间的所有文件。 这既简单又容易。