2012-12-25 21 views
7

के लिए दो बार बुलाया udnerstand नहीं कर सकते क्यों PerSession/WCF सेवा के लिए प्रकार निर्माता दो बार फोन कर रहा था। ConcurrencyModeMultiple है। बस एक लॉग मुझे लगता है कि static निर्माता दो बार, पहली बार बुलाया गया था में पांच एक साथ ग्राहकों को जो एक ही WCF सेवा विधि कॉल करते हैं, शुरू करने और एक अन्य ProcessId/ThreadId साथ 3 सेकंड दूसरी बार के बाद। कन्स्ट्रक्टर में न तो कोई अपवाद और न ही डब्ल्यूसीएफ ट्रेस लॉग। लॉग के अनुसार कन्स्ट्रक्टर निष्पादन समय ~ 10 मिलीसेकंड है। इसके परिणामस्वरूप सभी स्थिर क्षेत्रों को सभी सेवा उदाहरणों के बीच साझा नहीं किया जाता है जैसा कि माना जाता है और 5 क्लाइंट कनेक्शन के मामले में मेरे पास 5 सेवाएं और दो अलग-अलग स्थिर संदर्भ होते हैं, इसलिए ऑनसी स्थिर क्षेत्र में परिवर्तन सभी सेवाओं के लिए प्रतिबिंबित नहीं होता है।स्टेटिक निर्माता PerSession WCF सेवा

यह समस्या बहुत सी बातें confuses के बाद से मैं कुछ स्थिर कैश एकाधिक सेवा उदाहरणों भर में साझा पर भरोसा कर रहा हूँ।

सेवा IIS में होस्ट की है। कोई आईआईएस पुनरारंभ नहीं होता है, ऐपपूल इस समय अंतराल पर रीसायकल करता है।

[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

यदि आपका लक्ष्य यह सुनिश्चित करना है कि केवल एक उदाहरण बनाया गया है, तो आप इस कक्षा के लिए सिंगलटन पैटर्न को कार्यान्वित करना चाहेंगे: http://en.wikipedia.org/wiki/Singleton_pattern – Nogard

+2

@Nogard और यह इस में पूरी तरह से बेकार होगा मामला आईआईएस कार्यक्रम के कई उदाहरण खोल रहा है, जो सभी अपने स्वयं के सिंगलटन के लिए खुश हैं। स्टेटिक कन्स्ट्रक्टर को केवल क्लास लोड पर ही बुलाया जाता है - लेकिन यह उपयोगकर्ता को अलग-अलग ऐपडोमेन रखने से नहीं रोकता है जो कक्षाओं को अलग-अलग लोड करता है, जैसा आईआईएस के मामले में होता है। – TomTom

उत्तर

6

मान लिया जाये कि आप आईआईएस के साथ अपनी सेवा होस्ट कर रहे हैं, यह सामान्य व्यवहार जब तक आप स्पष्ट प्रक्रिया कॉन्फ़िगर केवल ऊपर काता जा रहा से एक भी AppDomain अनुमति देने के लिए है।

आप चल रही प्रक्रियाओं की सूची को देखें, तो आप अपने लॉग में प्रत्येक प्रक्रिया क्रमांक एक अलग appdomain होस्टिंग w3wp.exe की एक प्रति के साथ मेल खाती मिल जाएगा।

+0

आप सही हैं, यह आईआईएस होस्टेड सेवा है। इसका जिक्र करना भूल गए। बस अद्यतन सवाल। क्या मैं केवल एक विशेष डब्ल्यूसीएफ सेवा के लिए एकल 'ऐपडोमेन' व्यवहार स्थापित कर सकता हूं? क्योंकि चारों ओर अन्य सेवाओं के साथ-साथ हैं, इसलिए मैं नहीं चाहता कि गंदगी और कुछ – sll

+0

चाहते मैं, AppPool प्रति 2 कार्यकर्ता प्रक्रियाओं था '1' अब तक ठीक काम कर रहा everythign को परिवर्तित करने के बाद, वैसे भी स्पष्ट रूप में सभी WCF उदाहरणों की मेजबानी के लिए निर्दिष्ट करने के बारे में कोई सलाह की सराहना करते हैं एक ही प्रक्रिया – sll