2

我正在编写一个 web 服务并有以下观察结果:即使我只是将一个文本文件添加到存储 web 服务引用的所有 dll 的目录 (bin) 中,appdomain 也会刷新。

这会导致存储在字典(在其中一个 dll 中)中的所有用户会话被删除。

例如,如果上面的字典包含在一个 dll 中,比如 sessiondict.dll,而我正在用 sessiondict.dll 替换另一个没有任何依赖关系的 dll,那么为什么要丢失这些数据呢?

我错过了什么吗?

编辑:

虽然我正在阅读更多关于 AppDomain 重启的信息,但是,我还没有弄清楚为什么设计是这样的,即使在 bin 文件夹中添加一个文本文件也会导致 appdomain 重启。

4

2 回答 2

2

这是标准行为 - 任何时候 bin 目录中的任何内容(以及 web.config 等其他位置)被触及,那么您的 appdomain 将被回收。

您不应该将数据存储在 bin 目录中。您还应该知道,IIS 默认情况下会定期回收 appdomain,除非您告诉它不要这样做(我相信默认情况下每天一次)。

由于无论如何您都无法替换应用程序的一部分,因此我不确定这样做的正当理由是什么?

这篇文章很好地解释了可能导致 AppDomain 回收的原因。

于 2012-06-11T15:46:47.437 回答
0

Dictionary存储在 App 域内存中的局部变量中。当 bin 文件夹中的内容更新时,AppDomain 将被回收。回收意味着 .NET 卸载现有的 AppDomain(擦除存储在所有加载的类中的所有本地变量使用的内存)并构造新的 AppDomain 并启动新的类(这可能会Dictionary在您的代码中创建一个空)。

DLL是否更改都没有关系。的实例Class被破坏,因为 ASP.NET 认为 bin 文件夹中的任何更改都会影响配置,并且应该使用新配置重新启动站点。

要解决此问题,您可以:

  1. 将关键的 Session 变量存储在持久存储中(首选)
  2. 不要更新 BIN 文件夹的内容。
于 2012-06-11T15:56:50.250 回答