会话变量对象在回发时被删除 - ASP.NET

时间:2010-02-20 20:39:15

标签: asp.net session directory.delete

我做了类似下面的代码:

protected void Page_Load(object sender, EventArgs e)
{
   Label1.Text = Session["loginid"].ToString();
}

protected void delete_click(object sender, EventArgs e)
{
    delete("mail1",Session["loginid"]);
}

private int delete(string mailid, string user)
{
 System.IO.Directory.Delete(Server.MapPath(@"~\files\" + user + @"\" + mailid), true);
}

当我按下删除按钮时,一切正常,文件夹被删除。 但在那之后,当页面再次回传时 NullRefrenceException出现在  Label1.Text = Session [“loginid”]。ToString();

为什么会这样???

当我不使用此Directory.Delete()方法时,一切正常,会话变量未设置为null。

当我跟踪我的应用程序时,我发现After Directory.Delete()方法会话变量完好无损,我能够在Directory.Delete()之后的处理中使用这些会话变量。

但是一旦页面回发所有会话变量都设置为null。 当我没有使用这个delete()方法时,这个问题就不会出现了。

我删除的文件夹位于我项目的文件夹中。 我使用Visual Studio运行这个网站。

请帮忙。

6 个答案:

答案 0 :(得分:2)

这里只是另一个猜测,但也许是因为您在应用程序目录中修改了某些内容(因为您使用Server.MapPath并使用~)这是一种预感。 IIS可能认为应用程序已更改并回收应用程序,因此会清除所有会话。

这类似于在有人使用该应用程序时修改您的web.config文件,它会丢弃所有会话并回收应用程序。您是否删除了可能包含IIS正在为该应用程序使用的信息的目录?

你说它只会在你包含那行代码时才会发生,并且当IIS回收应用程序或超时时,会话实际上只会被一致地消除掉(除非你自己手动完成)。显然没有超时,所以回收必须是正在发生的事情。

答案 1 :(得分:1)

您的“文件”文件夹是否位于您的网络应用程序文件夹中?删除文件时,应用程序可能会重新启动。尝试使用sessionStateServer。它保持会议活着。

的Web.config:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>

答案 2 :(得分:1)

删除虚拟目录中的文件夹可能会导致应用程序重新启动,从而丢失所有会话数据。要防止这种情况,请删除单个文件(而不是文件夹)或使用StateServer维护会话。

答案 3 :(得分:0)

由于在您按下删除按钮之前页面加载正确,因此问题可能是Session["loginid"].ToString()引用。您是否有其他引用Session["loginid"]的代码?您在此处显示的代码不会执行从会话中删除loginid的任何操作。

但是,如果此应用程序在服务器群集上运行并且您正在使用进程内的默认会话模式,则可能会失去对HTTP请求之间的会话的访问权限,因为它们由不同的服务器处理。有关详细信息,请参阅here

答案 4 :(得分:0)

  

如果我删除了directory.delete()   函数从代码然后整个   应用程序运行如此之好没有   任何例外

好的,好像我们发现了你的问题。您的项目没有删除目录的必要权限(即使目录已被删除。但是:存在权限问题)

我猜你的应用程序在执行此文件操作时会抛出异常并开始新的会话。我的一个项目有一个类似的情况,但我仍然没有想出如何解决它。

如果您创建 Global.asax 并在 Application_OnError Session_OnStart 上设置断点,我很确定您会同意说明(或者但是这些方法拼写正确)。您将看到引发错误,然后启动新的会话。

答案 5 :(得分:0)

首先,进行一些健全性检查:

  1. 会话是否在其他页面上按预期工作?
  2. 您的Delete方法是否删除特殊ASP.NET文件夹中的文件,例如App_Data或App_Code,这可能会导致应用程序重新启动?
  3. 在检查完上述内容后,我将尝试调试此问题:

    1. 在delete方法上设置断点,并在监视窗口中显示会话变量。在调用Directory.Delete之前查看会话变量的值是什么以及之后是什么。是在你失去会话时,还是直到下一页访问?
    2. 使用像Fiddler这样的工具来检查在回发上浏览器和Web服务器之间交换的cookie。检查浏览器首次访问新会话时是否创建cookie并将其存储在浏览器中。然后,在删除文件夹时,查看Web服务器是否正在针对该回发的响应发送会话cookie。这表示已创建新会话。
    3. 由于