您好我对asp.net SESSIONS的工作原理不是很熟悉,但经过一些阅读后我发现它可以帮助我解决一个我没有太多努力的问题。
我的问题与允许用户在服务器上上传某些文档但实际上没有将其保存在数据库中直到他按下发布按钮的情况有关。
如果他上传文件并关闭浏览器,文件仍保留在文件系统上,无法知道那里保存了哪些文件。
为了解决这个问题,我决定在会话中存储文档的细节,而不是保存在fileSystem上的实际文档。
当页面首次加载时,会根据会话中存储的数据执行文件系统的清理。
现在唯一剩下的就是能够处理用户关闭浏览器并且会话在此期间到期的情况。
经过一些研究后,我发现当会话到期时,即使浏览器关闭,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分钟,它似乎适用于我尝试过的所有情况。
任何人都可以确认这是否是解决问题的可靠方法?
我有什么遗失的吗?
答案 0 :(得分:2)
出于多种原因,这不是一种可靠的机制。
首先,将会话设置为1分钟?这不是很长..你真的希望暂停一分钟的用户让他们的会话结束吗?你的意思是你把它设置为1分钟以便测试?通常会话超时更像是20分钟。
其次,在工作进程被回收的情况下,不会调用Session_End。也就是说,如果工作进程崩溃,则设置为按计划进行回收,或者手动回收。
我只是让你的清理过程删除所有时间戳大于特定时间的文件。这很简单。