2

我有一个 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);
        }
    }

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

为什么会发生这种情况?

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

4

3 回答 3

3

看看这个帖子,我相信你的问题可能是相似的:

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

您的 WebMethod 是否实际访问 Session 状态?如果没有,请尝试添加对虚拟会话变量的访问。

更新:

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

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

更新 2

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

全球.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;
    }
}
于 2012-07-07T12:28:49.453 回答
0

您是否将以下内容添加到您的 WebMethods 中?

[WebMethod (EnableSession = true)]
于 2012-07-07T11:45:19.617 回答
0

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

于 2012-07-07T11:52:56.540 回答