2012-07-07 93 views
2

我有一个Asp.net的web服务。它有方法M1。 M1为每个会话创建一个文件夹。当会话过期时,我使用以下代码在global.asax中删除该文件夹。为什么asp.net会话比其超时更早过期?

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”按钮时(会话超时和文件夹被删除后),其会话开始(创建文件夹)和结束(删除文件夹)在我设置的超时之前。

为什么会发生这种情况?

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

回答

3

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

  • 客户端发送一个会话ID的Cookie的会话过期
  • 服务器创建一个新会话,把通过发送的ID客户端
  • 如果请求不访问会话,会话立即被放弃。

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

更新:

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

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

更新2

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

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

是的,我使用会话状态 – breceivemail 2012-07-08 05:16:08

+0

你不使用'Session_Start'和'Session_End'为***计数***用户? 我使用WebFarm,sessionsate模式SqlServer。 任何源代码samplefull? 未找到链接,请使用http://thecodeking.co.uk/article/asp-net-session-end-event-fires-immediately-after%20session-start-resolved/ – 2016-11-05 13:17:55

0

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

[WebMethod (EnableSession = true)] 
+0

是我做到了。如果我为每个方法调用打开一个新窗口,则一切正常。但是当我第二次点击“Invoke”按钮时,我遇到了问题。 – breceivemail 2012-07-07 11:47:47

+0

这就像是针对同一会话的缓存问题。 – breceivemail 2012-07-07 11:48:54

+0

是不是由Cookie管理的会话?什么是您的cookie过期时间 – Doomsknight 2012-07-07 11:53:18

0

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

+0

我知道这一点。不,我正在创建应用程序主文件夹之外的文件夹。我已经测试并知道Application_End没有被触发。 – breceivemail 2012-07-07 11:55:51

+0

您还需要在客户端代码上启用会话。只要尝试编写客户端应用程序(不在浏览器上测试)并将cookie容器分配给它。 http://www.drbob42.com/examines/examin47.htm – hkutluay 2012-07-07 11:59:48