PerSession
/WCF hizmeti için tip kurucunun neden iki kez çağıracağını anlayamıyorsunuz. ConcurrencyMode
, Multiple
. Sadece aynı WCF hizmet yöntemi çağrısı yapan beş eşzamanlı istemcinin başlatılması, bir günlükte static
yapıcısının iki kere çağrıldığını görüyorum, ilk kez ve 3 saniye sonra diğeri ProcessId/ThreadId
. Yapıcıda ne de WCF izleme günlüklerinde istisna yoktur. Oluşturucu çalıştırma süresi, kayıt başına ~ 10 milisaniyedir. Bu, tüm statik alanların varsayıldığı şekilde tüm servis örnekleri arasında paylaşılmadığı ve 5 istemci bağlantısının olması durumunda 5 hizmetim ve iki farklı statik bağlamım olmadığı için, statik hizmetlerdeki tüm alanların değişmemesi anlamına gelir.PerSession WCF hizmeti için iki kez çağrılan statik yapıcı
Birden çok hizmet örneğinde paylaşılan bazı statik önbelleklere güvendiğim için bu sorun birçok şeyi karıştırıyor.
Hizmet, IIS
adresinde barındırılmaktadır. Hiçbir IIS yeniden başlatılmaz, AppPool bu zaman aralığında geri dönüşüm yapar.
[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;
}
}
}
Amacınız yalnızca bir örnek oluşturulduğundan emin olmak istiyorsanız, bu sınıf için Singleton desenini uygulamak isteyebilirsiniz: http://en.wikipedia.org/wiki/Singleton_pattern – Nogard
@Nogard ve bu tamamen bu işe yaramaz olacak IIS, programın birden fazla örneğini açarken, bunların tümü de kendi tekil dosyalarına sahip olmaktan mutluluk duyar. Statik kurucular da SINIF YÜK ÜZERİNDE SADECE BİR KEZ çağrıldığını olarak tanımlanır - ancak IIS ile olduğu gibi o ayrı sınıflarını yüklemek ayrı appdomains sahip olmaktan kullanıcıyı durdurmaz. – TomTom