PerSession
/WCFサービスの型コンストラクターが2回呼び出された理由を理解できません。ConcurrencyMode
ですMultiple
。同じWCFサービスメソッド呼び出しを実行する5つの同時クライアントを起動するだけで、ログにstatic
コンストラクターが2回呼び出されたことがわかります。1回目と3秒後にもう1回呼び出されましたProcessId/ThreadId
。コンストラクター自体にもWCFトレースログにも例外はありません。コンストラクターの実行時間は、ログごとに最大10ミリ秒です。この結果、すべての静的フィールドが想定どおりにすべてのサービスインスタンス間で共有されるわけではなく、5つのクライアント接続の場合、5つのサービスと2つの異なる静的コンテキストがあるため、静的フィールドの変更がすべてのサービスに反映されるわけではありません。
複数のサービスインスタンス間で共有される静的キャッシュに依存しているため、この問題は多くのことを混乱させます。
サービスはでホストされてい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;
}
}
}