3

我做了类似下面的代码:

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);
}

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

为什么会这样……??

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

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

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

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

请帮忙。

4

6 回答 6

2

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

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

您说只有当您包含该行代码时才会发生这种情况,并且当应用程序被 IIS 回收或超时时,会话实际上只会被一致地清除(除非您自己手动执行)。它显然没有超时,所以回收一定是正在发生的事情。

于 2010-02-24T17:44:30.470 回答
1

您的“文件”文件夹在您的 Web 应用程序文件夹中吗?当您删除文件时,应用程序可能会自行重新启动。尝试使用 sessionStateServer。它使会话保持活力。

网络配置:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>
于 2010-02-20T22:43:41.617 回答
1

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

于 2010-02-24T17:27:07.217 回答
0

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

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

于 2010-02-20T20:56:03.437 回答
0

如果我从代码中删除 directory.delete() 函数,那么整个应用程序运行得很好,没有任何异常

好的,看来我们发现了您的问题。您的项目没有删除目录的必要权限(即使删除了目录。尽管如此:存在权限问题)

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

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

于 2010-02-20T21:16:44.603 回答
0

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

  1. 会话在其他页面上是否按预期工作?
  2. 您的 Delete 方法是否会删除特殊 ASP.NET 文件夹(如 App_Data 或 App_Code)中的文件,这可能会导致应用程序重新启动?

在检查上述内容后,我将尝试调试此问题:

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

谢谢

于 2010-02-20T22:54:56.550 回答