【问题标题】:Static variables in WCF Service lose valuesWCF 服务中的静态变量丢失值
【发布时间】:2014-08-22 07:44:59
【问题描述】:

我有一个由 IIS 7.5 托管的 WCF 服务,其中包含静态变量。 该服务被称为零星的,并且有一段时间变量保持它们的值。 但是有时它们会丢失值并重新初始化-我不知道为什么。 首先我认为这是因为应用程序池回收,所以我将回收间隔更改为无限 - 但它仍然发生。
我在任务管理器中观察到 w3wp.exe:在静态变量重置发生后它仍然具有相同的 PID,对服务的新调用转到同一个工作进程 - 所以我们可以排除应用程序池回收,对吗?
那么那里发生了什么,我该如何解决它,有什么想法吗?
本服务使用

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

这里是我做的几个测试的结果:
当我阻止调用由 Thread.Sleep() 返回时甚至会发生这种情况,因此也可以排除工作进程的空闲超时(设置为 20 分钟)吗?有时它会在静态重置之前运行几个小时。
但似乎“旧”等待线程仍然存在,因为我可以通过外部信号使其继续运行(在无限循环中的睡眠之间 X 秒后检查 SQL 表条目)。 它就像“另一个世界”,静态变量仍然存在并且线程继续运行,但是来自随机时间的每个新调用都在一个带有新变量的新世界中运行......
有人解决这个问题吗?

2014 年 8 月 28 日
对这件事没有想法? 几个测试表明:没有真正的“重置”发生,而是在某个未知/随机时间,当我进行服务调用(用于测试)时,静态构造函数被调用,静态变量被设置为其初始值。好像应用程序池之前被回收了一样。但它没有——我观察了事件日志(过滤器:源“WAS”)——没有回收。
这到底是怎么回事?

【问题讨论】:

    标签: wcf static reset


    【解决方案1】:

    静态成员实际上是每个 AppDomain,而不是每个线程或每个应用程序池。在我的脑海中,我不知道 WAS 如何创建用于托管 WCF 服务实例的 AppDomain,我也不确定在哪里可以找到,但它让我印象深刻,因为 WAS 可以准确地完成它的工作喜欢和不应该被依赖。

    如果我有时间做更多研究,我可能会在稍后添加编辑,因为这是一个有点有趣的问题。我可以问为什么你使用静态变量吗?在我看来,这听起来像是自找麻烦。

    【讨论】:

    • 在 Application_Start (Global.asax) 上,我将数据从 SQL 加载到一些静态变量中,以便每次调用服务都可以访问这些数据,而无需每次都执行 sql 请求。我不认为这样做有什么不寻常的。但正如我所说,在某个时候(再次)调用静态构造函数,变量被重置为默认值,但没有发生回收(然后由于 Application_Start,它们将具有正确的值)。
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多