2012-12-25 12 views
7

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; 
     } 
    } 
} 
+0

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

+2

@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

cevap

6

IIS ile barındırma hizmeti ediyoruz varsayarsak, bu açıkça sadece yukarı bükülmüş olmaktan tek bir AppDomain izin verecek sürecini yapılandırmak sürece normal bir davranıştır. çalıştırmakta işlemler listesinde bakarsak

, kendi günlüğünde her işlem kimliği ayrı bir AppDomain barındıran w3wp.exe bir kopyasıyla tekabül bulacaksınız.

+0

Haklısınız, bu IIS tarafından sunulan hizmettir. Bunu bahsetmeyi unuttum. Sadece güncellenmiş soru. Tek bir 'AppDomain' davranışını sadece belirli bir WCF servisi için ayarlayabilir miyim? etrafında de diğer hizmetlerdir Çünkü başka bir şey – sll

+0

pisliği istemiyorum bu yüzden gayet iyi durumda '1' everythign için değiştirdikten sonra, AppPool başına 2 alt işlemleri vardı, yine tüm WCF örneklerini barındırması belirterek açıkça ilgili herhangi bir tavsiye takdir aynı süreç – sll