gpt4 book ai didi

c# - 为 PerSession WCF 服务调用两次静态构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:24:41 25 4
gpt4 key购买 nike

无法理解为什么 PerSession/WCF 服务的类型构造函数调用了两次。 ConcurrencyModeMultiple。刚刚同时启动五个执行相同 WCF 服务方法调用的客户端,在日志中我看到 static 构造函数被调用了两次,第一次是在 3 秒后第二次调用另一个 ProcessId/线程 ID。构造函数本身和 WCF 跟踪日志中都没有异常。根据日志,构造函数执行时间约为 10 毫秒。这导致所有静态字段并未按预期在所有服务实例之间共享,并且在 5 个客户端连接的情况下,我有 5 个服务和两个不同的静态上下文,因此不会为所有服务反射(reflect) onse 静态字段的更改。

这个问题混淆了很多事情,因为我依赖于跨多个服务实例共享的一些静态缓存。

服务托管在 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 副本。

关于c# - 为 PerSession WCF 服务调用两次静态构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com