【问题标题】:Why asp.net session is expired sooner than its timeout?为什么 asp.net 会话的过期时间早于其超时时间?
【发布时间】:2012-07-07 15:26:31
【问题描述】:

我有一个 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 时,它运行正常,并且在我设置的超时到期时间删除文件夹。但是当我第二次提交 web 服务的“调用”按钮时(在会话超时和文件夹被删除之后),它的会话 starts(创建文件夹)和 ends(删除文件夹) 就在我设置的超时之前。

为什么会这样?

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

【问题讨论】:

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


    【解决方案1】:

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

    • 客户端发送一个带有会话 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;
        }
    }
    

    【讨论】:

    • 你不为 Count 个用户使用 Session_StartSession_End 吗?我使用 WebFarm,会话模式 SqlServer。任何源代码samplefull?未找到链接,请使用thecodeking.co.uk/article/…
    【解决方案2】:

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

    [WebMethod (EnableSession = true)]
    

    【讨论】:

    • 是的,我做到了。如果我为每个方法调用打开一个新窗口,一切正常。但是当我第二次单击“调用”按钮时出现问题。
    • 这类似于相同会话的缓存问题。
    • 会话不是由 cookie 管理的吗?您的 cookie 过期时间是多少
    • 我如何检查以及其他选项是什么?
    【解决方案3】:

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

    【讨论】:

    • 我知道这一点。不,我在应用程序的主文件夹之外创建文件夹。而且我已经测试并且知道Application_End没有被触发。
    • 您还需要在客户端代码上启用会话。只需尝试编写客户端应用程序(不在浏览器上测试)并为其分配 cookie 容器。 drbob42.com/examines/examin47.htm
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多