无法理解为什么类型构造函数PerSession
/WCF 服务调用了两次。ConcurrencyMode
is 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 副本相对应。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)