C# 为什么asp.net会话的过期时间早于其超时时间?

C# 为什么asp.net会话的过期时间早于其超时时间?,c#,asp.net,web-services,timeout,C#,Asp.net,Web Services,Timeout,我有一个Asp.net Web服务。它有方法M1。M1为每个会话创建一个文件夹。当会话过期时,我使用以下代码删除global.asax中的文件夹 void Session_End(object sender, EventArgs e) { try { System.IO.DirectoryInfo dirMyPacksFolder = new System.IO.DirectoryInfo(Utilities.getMyPacksF

我有一个Asp.net Web服务。它有方法M1。M1为每个会话创建一个文件夹。当会话过期时,我使用以下代码删除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);
        }
    }
当我在浏览器中打开我的webservice并调用M1时,它运行正常,并且在我设置的超时过期时间删除文件夹。但是当我第二次提交webservice的“调用”按钮时(在会话超时和文件夹被删除之后),它的会话在我设置的超时之前立即开始(创建文件夹)并结束(删除文件夹)

为什么会发生这种情况?


如果我为每个方法调用打开一个新窗口(新会话),一切都正常。但当我第二次点击“调用”按钮时,我遇到了问题。这类似于相同会话的缓存问题。

您是否向WebMethods中添加了以下内容

[WebMethod (EnableSession = true)]

如果要在web服务路径下创建和删除文件夹,iis将立即重新启动。看看这个。

看看,我相信你的问题可能与此类似:

  • 客户端发送一个cookie,其中包含过期会话的会话Id
  • 服务器创建一个新会话,重用客户端发送的id
  • 如果请求不访问会话,则该会话将立即被放弃
您的WebMethod是否实际访问会话状态?如果没有,请尝试添加对虚拟会话变量的访问权限

更新:

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

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

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

Global.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;
    }
}

是的。如果我为每个方法调用打开一个新窗口,一切都正常。但当我第二次点击“调用”按钮时,我遇到了问题。这类似于相同会话的缓存问题。会话不是由cookie管理的吗?你的cookie过期期限是多少?我如何检查这一点以及其他选项是什么?我知道这一点。否我正在应用程序主文件夹之外创建文件夹。我已经测试并知道应用程序_End不会被触发。您还需要在客户端代码上启用会话。。只需尝试编写一个客户端应用程序(而不是在浏览器上测试)并为其分配cookie容器。您不使用计数用户的
Session\u Start
Session\u End
?我使用WebFarm,会话状态模式SqlServer。有完整的源代码样本吗?未找到链接,请使用