Appdomain刷新/重启

时间:2012-06-11 15:26:30

标签: c# .net

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

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

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

我错过了什么吗?

修改

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

2 个答案:

答案 0 :(得分:2)

这是标准行为 - 只要触摸bin目录中的任何内容(以及web.config等其他位置),您的appdomain就会回收。

您不应将数据存储在bin目录中。您还应该知道,默认情况下,IIS会定期回收应用程序域,除非您已经告知过它(默认情况下我认为每天一次)。

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

This post可以很好地解释导致AppDomain回收的原因。

答案 1 :(得分:0)

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

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

要解决此问题,您可以:

  1. 将关键会话变量存储在持久存储中(可预见)
  2. 不要更新BIN文件夹的内容。