gpt4 book ai didi

c# - 为什么 asp.net session 过期早于超时?

转载 作者:行者123 更新时间:2023-11-30 22:27:16 24 4
gpt4 key购买 nike

我有一个 Asp.net 网络服务。它有方法M1。 M1 为每个 session 创建一个文件夹。当 session 过期时,我使用以下代码删除 global.asax 中的该文件夹。

void Session_End(object sender, EventArgs e)
{
try
{
System.IO.DirectoryInfo dirMyPacksFolder = new System.IO.DirectoryInfo(Utilities.getMyPacksFolder(Session));
//dirMyPacksFolder.Parent.CreateSubdirectory("ended_" + Session.SessionID);
if (dirMyPacksFolder.Exists)
{
dirMyPacksFolder.Delete(true);
}
}
catch (Exception ex)
{
Utilities.logException("", ex);
}
}

当我在浏览器中打开我的网络服务并调用 M1 时,它运行正常并且文件夹在我设置的超时到期时间被删除。但是当我第二次提交网络服务的“调用”按钮时( session 超时和文件夹被删除后),它的 session 开始(创建文件夹)和结束(删除文件夹) 紧接在我设置的超时之前。

为什么会这样?

如果我为每个方法调用打开一个新窗口(新 session ),一切正常。但是当我第二次单击“调用”按钮时出现问题。这类似于相同 session 的缓存问题。

最佳答案

看看this post ,我相信你的问题可能是类似的:

  • 客户端为过期的 session 发送一个带有 session ID 的 cookie
  • 服务器创建一个新的 session ,重用客户端发送的id
  • 如果请求没有访问session,则session立即被放弃。

您的 WebMethod 是否实际访问 session 状态?如果不是,请尝试添加对虚拟 session 变量的访问。

更新:

Global.asax 中的这些代码行解决了问题:

 void Session_Start(object sender, EventArgs e)
{
Session["dummy"] = "dummy session for solving immediate session expire";
}

更新 2

我个人不会在 Session_Start 中创建目录;相反,我有一个名为 EnsureMyPacksFolder 的方法,应用程序需要在任何尝试访问该文件夹之前调用该方法。这看起来类似于以下内容,避免了对“虚拟” session 变量的需要,并且意味着该文件夹仅在实际需要时才创建。

全局.asax:

void Session_Start(object sender, EventArgs e)
{
// No code needed in Session_Start
}

void Session_End(object sender, EventArgs e)
{
if (Session["MyPacksFolder"] != null)
{
// Folder has been created, delete it
// ... add code to delete folder as above
}
}

其他地方:

public static void EnsureMyPacksFolder()
{
if (Session["MyPacksFolder"] == null)
{
// Add code to create MyPacksFolder that was previously in Session_Start

Session["MyPacksFolder"] = true;
}
}

关于c# - 为什么 asp.net session 过期早于超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11374585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com