我有一个由IIS 7.5托管的WCF服务,其中包含静态变量。 该服务被称为零星的,有一段时间变量保持其价值。 但是在某个时候他们失去了价值并重新初始化 - 我不知道为什么。 首先我认为这是因为应用程序池的回收,所以我将回收间隔改为无限 - 但它仍然发生 我在任务管理器中观察到w3wp.exe:静态变量重置发生后,它仍然具有相同的PID,对服务的新调用转到同一个工作进程 - 所以我们可以排除应用程序池回收,对吧? 那么在那里发生了什么以及我如何解决它,任何想法? 该服务使用
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
这里我做了几个测试的结果:
它甚至发生在我通过Thread.Sleep()阻止调用返回时,因此也可以排除工作进程的空闲超时(设置为20分钟)?有时它会在重置静力学之前的几个小时内运行
但似乎" old"等待线程仍然存在,因为我可以通过外部信号继续运行(在无限循环中睡眠之间X秒后检查的SQL表项)。
它喜欢"另一个世界"静态变量仍然存在且线程继续运行的地方,但随机时间的每个新调用都在一个带有新变量的新世界中运行......
有人解决这个问题吗?
2014年8月28日
这件事没有想法?
几项测试表明:没有真正的重置"当我进行服务调用(用于测试)时,在某个未知/随机时间发生,正在调用静态构造函数并将静态变量设置为其初始值。好像应用程序池之前已被回收。但它没有 - 我观察了事件日志(过滤器:来源" WAS") - 没有回收。
这到底是怎么回事?
答案 0 :(得分:0)
静态成员实际上是每个AppDomain,而不是每个线程或每个应用程序池。我不知道WAS如何创建用于托管WCF服务实例的AppDomains,而且我不知道我在哪里找到它,但它让我感到震惊WAS可以完全按照自己喜欢的方式行事,而不是依赖它。
如果我开始做更多的研究,我可以稍后添加一个编辑,因为这是一个有点有趣的问题。我可以问为什么你使用静态变量?在我看来,这听起来像是在寻找麻烦。