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

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

为什么会这样?

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

看看这篇文章 ,我相信你的问题可能类似:

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

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

 [WebMethod (EnableSession = true)] 

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