C# 为什么asp.net会话的过期时间早于其超时时间?
我有一个Asp.net Web服务。它有方法M1。M1为每个会话创建一个文件夹。当会话过期时,我使用以下代码删除global.asax中的文件夹C# 为什么asp.net会话的过期时间早于其超时时间?,c#,asp.net,web-services,timeout,C#,Asp.net,Web Services,Timeout,我有一个Asp.net Web服务。它有方法M1。M1为每个会话创建一个文件夹。当会话过期时,我使用以下代码删除global.asax中的文件夹 void Session_End(object sender, EventArgs e) { try { System.IO.DirectoryInfo dirMyPacksFolder = new System.IO.DirectoryInfo(Utilities.getMyPacksF
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);
}
}
当我在浏览器中打开我的webservice并调用M1时,它运行正常,并且在我设置的超时过期时间删除文件夹。但是当我第二次提交webservice的“调用”按钮时(在会话超时和文件夹被删除之后),它的会话在我设置的超时之前立即开始(创建文件夹)并结束(删除文件夹)。
为什么会发生这种情况?
如果我为每个方法调用打开一个新窗口(新会话),一切都正常。但当我第二次点击“调用”按钮时,我遇到了问题。这类似于相同会话的缓存问题。您是否向WebMethods中添加了以下内容
[WebMethod (EnableSession = true)]
如果要在web服务路径下创建和删除文件夹,iis将立即重新启动。看看这个。看看,我相信你的问题可能与此类似:
- 客户端发送一个cookie,其中包含过期会话的会话Id
- 服务器创建一个新会话,重用客户端发送的id
- 如果请求不访问会话,则该会话将立即被放弃
void Session_Start(object sender, EventArgs e)
{
Session["dummy"] = "dummy session for solving immediate session expire";
}
更新2
就我个人而言,我不会在Session_Start中创建目录;相反,我有一个名为EnsureMyPacksFolder
的方法,在尝试访问文件夹之前,应用程序需要调用该方法。这将类似于下面的内容,避免了对“虚拟”会话变量的需要,并且意味着只有在实际需要时才创建文件夹
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;
}
}
是的。如果我为每个方法调用打开一个新窗口,一切都正常。但当我第二次点击“调用”按钮时,我遇到了问题。这类似于相同会话的缓存问题。会话不是由cookie管理的吗?你的cookie过期期限是多少?我如何检查这一点以及其他选项是什么?我知道这一点。否我正在应用程序主文件夹之外创建文件夹。我已经测试并知道应用程序_End不会被触发。您还需要在客户端代码上启用会话。。只需尝试编写一个客户端应用程序(而不是在浏览器上测试)并为其分配cookie容器。您不使用计数用户的
Session\u Start
和Session\u End
?我使用WebFarm,会话状态模式SqlServer。有完整的源代码样本吗?未找到链接,请使用