为什么asp.net会话比其超时更早到期?

时间:2012-07-07 11:27:15

标签: c# asp.net web-services timeout

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

当我在浏览器中打开我的web服务并调用M1时,它正常运行,并且在我设置的超时到期时间内删除了该文件夹。但是当我第二次提交webservice的“Invoke”按钮时(会话超时和文件夹被删除),其会话启动(创建文件夹)和结束(删除文件夹) )在我设定的超时之前。

为什么会这样?

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

3 个答案:

答案 0 :(得分:3)

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

  • 客户端发送一个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的方法,在尝试访问该文件夹之前,应用程序需要调用该方法。这看起来类似于以下内容,避免了对虚拟&#34;会话变量,表示仅在实际需要时才创建文件夹。

的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;
    }
}

答案 1 :(得分:0)

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

[WebMethod (EnableSession = true)]

答案 2 :(得分:0)

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