为session WCF服务调用两次静态构造函数
本文关键字:两次 静态 构造函数 session WCF 服务 调用 | 更新日期: 2023-09-27 17:49:33
无法理解为什么PerSession
/WCF服务的类型构造函数被调用了两次。ConcurrencyMode
是Multiple
。刚刚启动五个同时执行相同WCF服务方法调用的客户端,在日志中我看到static
构造函数被调用两次,第一次和3秒后第二次与另一个ProcessId/ThreadId
。在构造函数本身和WCF跟踪日志中都没有异常。每个日志的构造函数执行时间约为10毫秒。这导致所有的静态字段不会像预期的那样在所有服务实例之间共享,并且在5个客户端连接的情况下,我有5个服务和两个不同的静态上下文,因此一个静态字段的更改不会反映在所有服务上。
这个问题混淆了很多东西,因为我依赖于多个服务实例共享的一些静态缓存。
服务托管在IIS
中。没有IIS重启,AppPool在此时间间隔内回收。
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerSession,
IncludeExceptionDetailInFaults = true,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class WcfService
{
private static readonly ILog logger;
private static volatile bool typeInitialized;
static WcfService()
{
try
{
// Here is typeInitialized is false in both calls
logger = LogManager.GetLogger("LogName");
logger.InfoFormat("[PID:{0}] [THID:{1}] BEGIN Static constructor",
Process.GetCurrentProcess().Id,
Thread.CurrentThread.ManagedThreadId);
}
catch (Exception exception)
{
logger.Error("error on type construction stage", exception);
}
finally
{
logger.InfoFormat("[PID:{0}] [THID:{1}] END Static constructor",
Process.GetCurrentProcess().Id,
Thread.CurrentThread.ManagedThreadId);
typeInitialized = true;
}
}
}
假设您使用IIS托管服务,这是正常的行为,除非您显式地配置该进程以只允许单个AppDomain被启动。
如果您查看正在运行的进程列表,您会发现日志中的每个进程Id对应于托管单独应用域的w3wp.exe副本。