c# - 为什么 ASP.NET session 的过期时间早于其超时时间?

标签 c# asp.net web-services timeout

我有一个 Asp.net Web 服务。它有方法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);
        }
    }

当我在浏览器中打开 Web 服务并调用 M1 时,它运行正常,并且在我设置的超时到期时间删除文件夹。但是,当我第二次提交Web服务的“调用”按钮时(在 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/

相关文章:

c# - 发送预约后获取预约 ID

c# - 如何通过 COM 创建从 C#/.NET 到 C++ 的回调?

asp.net - web.config 和 machine.config 之间的区别?

c# - 是否可以创建匿名类型泛型?

java - 在代理后面使用 axis2 Web 服务时出现问题

web-services - Flex 3 获取网络服务调用以等待结果

java - Apache CXF 拦截器覆盖内容类型

c# - 如何将 DataTable 序列化为 json 或 xml

asp.net - 值文件上传 - 适用于 Chrome,但不适用于 IE,Image img = Image.FromStream(Request.InputStream)

c# - 如何创建非模态形式但阻塞?