0

我有一个情况:

我在 webapp 中上传用户控件,然后在需要时加载它们。有时我不想要其中的一些。所以我想从我的网络应用程序中删除它们。

这是找到控件的层次结构。

/controls
/controls/uc/
/controls/uc/ctrl1/ctrl1.ascx(带有 ctrl.ascx.cs)
/controls/uc/ctrl2/ctrl2.ascx(带有 ctrl.ascx.cs)

现在从delete.aspx 中,我得到了我从中选择目录结构的代码。并拿起控制目录“ctrl1(n)”并使用删除递归删除目录。

删除结束后,我使用 asp.net 的重定向功能重定向页面。但是一旦网页被重定向,会话就结束了,它要求我登录(因为只有登录的用户可以删除控件)

为什么会有这种奇怪的行为?

请记住,app_code中没有找到任何代码,所有控件都放在网站根目录下,如上所示。

编辑:当然它不是预编译的!

有什么帮助吗?

4

3 回答 3

1

删除正在运行的应用程序(甚至是网站项目)中的类很可能会导致应用程序池回收、结束会话和其他所有内容。
上传用户控件的整个想法似乎很奇怪。

有关详细信息:ASP.NET 案例研究:丢失的会话变量和 appdomain 回收

于 2012-06-05T09:13:06.180 回答
1

对目录结构(但不是文件,请注意)的每次更改都会导致应用程序池回收 - 您正在做的事情令人怀疑,但不要删除任何文件夹(仅文件),您应该没问题。

于 2012-06-05T09:28:11.870 回答
0

好的,我花了一些时间来解决这个问题......听起来它可能不是一个解决方案,但到目前为止我想要的已经实现了。

我所做的是将会话状态定义为“StateServer”,当我删除文件夹时,它会重新启动应用程序池,但会话仍然存在。由于应用程序池回收取决于几个因素,包括删除网站的子文件夹,因此您不能碰巧停止它,但实际上可以保留会话。如果您删除文件夹,它不会导致会话丢失,但当然应用程序将重新启动,您必须不惜一切代价接受!

反正,

我在主机上的 web.config 中使用了以下配置节点:

<system.web>
    <sessionState mode="StateServer"  cookieless="false" timeout="20" />
</system.web>

当然,在我的本地主机上这样做了:

<system.web>
    <sessionState mode="StateServer"  stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" />
</system.web>

注意:在 localhost 上,您必须启动 ASP.NET 状态管理服务

概括:

  1. 您必须将 SessionState 定义为 StateServer 或 SqlServer 才能保留会话。这是你至少可以做的。

  2. 在开发此类应用程序时,您必须为它们提供应对应用程序重启周期的方法。

  3. 您必须使会话变量尽可能简单,不要放置大对象或依赖于许多其他对象的对象。序列化和反序列化需要大量时间才能让它们来回移动。

于 2012-06-11T08:07:28.840 回答