2012-06-13 18 views
5

में होस्ट की गई डब्ल्यूसीएफ सेवा का जीवन चक्र प्रश्न वर्ग में स्थिर डेटा के संबंध में है।आईआईएस

यदि यह एक सेवा वर्ग है तो मुझे लगता है कि तत्काल मोड महत्वपूर्ण है। लेकिन अगर मेरे पास एक और स्टैंडअलोन सिंगलटन क्लास है तो क्या होगा?

क्या मैं वहां एक ऑब्जेक्ट बना सकता हूं जो सभी प्रति-कॉल कॉल के लिए उपलब्ध होगा? क्या आईआईएस में हमेशा के लिए स्मृति में वह डीएल है ताकि सिंगलटन स्मृति में हर समय होगा?

मैं सभी डब्ल्यूसीएफ क्लाइंट कॉल के लिए कुछ वस्तु कैसे उपलब्ध कर सकता हूं? क्या आईआईएस में ऐसा करना संभव है या क्या मुझे विंडोज सेवा में डब्ल्यूसीएफ सेवा की मेजबानी करनी चाहिए?

उत्तर

2

मेरे स्थानीय आईआईएस में जांच की गई समस्या।

यह मेरा कोड है।

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 

    public static int _counter = 0; 

    public string GetData() 
    { 
     _counter++; 
     return _counter.ToString(); 
    } 
} 

डिफ़ॉल्ट आईआईएस कॉन्फ़िगरेशन के साथ एक प्रक्रिया प्रति एप्लिकेशन खींचने के लिए एक प्रक्रिया चलायी जाती है और यह कोड अपेक्षा के अनुसार काम करता है। परिणाम प्रत्येक सेवा कॉल में वृद्धि हुई है।

यह समझ में आता है क्योंकि InstanceContextMode थ्रेडिंग का प्रबंधन नहीं करता है। यह केवल InstanceContext जीवनकाल का जीवनकाल नियंत्रित करता है।

यह जानकर कि हम अभी भी म्यूटेबल डेटा के लिए स्थिर चर के रूप में सर्वोत्तम चर का उपयोग करने पर विचार नहीं कर सकते हैं। आईआईएस को "वेब गार्डन" के रूप में कॉन्फ़िगर किया जा सकता है। उस कॉन्फ़िगरेशन का अर्थ है कि प्रति एप्लिकेशन पूल में एक से अधिक कार्य प्रक्रिया की अनुमति है और प्रत्येक प्रक्रिया में स्थिर चर की अपनी प्रति होगी।

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools

मैं कैसे किसी वस्तु सभी WCF ग्राहक कॉल के लिए उपलब्ध होने की कर सकते हैं? क्या आईआईएस में ऐसा करना संभव है या क्या मुझे डब्ल्यूसीएफ सेवा को विंडोज सेवा में होस्ट करना चाहिए?

ऑब्जेक्ट्स को लगातार स्टोरेज जैसे डेटाबेस या वितरित कैश में संग्रहीत किया जाना चाहिए। आईआईएस अभी भी सेवाओं के लिए एक महान मेजबान बनने के लिए बनी हुई है और यह सबकुछ प्रदान करता है जो विंडोज सेवा और भी बहुत कुछ कर सकता है।

2

आप

  • आप एक स्थिर वर्ग है, तो प्रदान की कुछ कम संदर्भ के आधार पर संकेत प्रदान करेगा, राज्य जब तक आप एक ही WCF प्रॉक्सी की पहुंच है बनाए रखा है। मेजबान (आईआईएस या विंडोज सेवा) कोई फर्क नहीं पड़ता।

  • यदि आप ग्राहक अनुरोधों में 'वैश्विक स्थैतिक चर' बनाए रखना चाहते हैं, तो आप उन्हें एक संग्रह (फ़ाइल/डेटाबेस/आदि) में क्यों स्टोर नहीं करते हैं?

  • यदि आप प्रत्येक ग्राहक अनुरोध के लिए राज्य को बनाए रखना चाहते हैं, तो आप 'टिकाऊ डब्ल्यूसीएफ सेवाओं' को आजमा सकते हैं (related thread)। मैंने इसे पहले इस्तेमाल किया है - इसलिए यह काम करता है बशर्ते आपके परिदृश्य सत्र की तरह सत्र की मांग करे और प्रदर्शन लागत से अवगत हो।

उम्मीद है कि इससे मदद मिलती है।

+0

मुझे पहली बात नहीं मिलती है (वास्तव में आपका क्या मतलब है: वही डब्ल्यूसीएफ प्रॉक्सी?) दूसरा बिंदु, क्योंकि मैं डीबी से कुछ डेटा लोड करना चाहता हूं और ग्राहकों को इसकी सेवा करना चाहता हूं (गति प्रासंगिक है)। दूसरी तरफ टिकाऊ सेवाएं, जहां तक ​​मुझे पता है कि क्लाइंट के सत्र डेटा को स्टोर करने के लिए कुकीज़ का उपयोग करें। तो एक विंडोज़ सेवा में एक डब्ल्यूसीएफ की मेजबानी करने का सही विकल्प है? – John

+1

@ जॉन - पहली बार, 'डब्ल्यूसीएफ प्रॉक्सी' द्वारा, मेरा मतलब क्लाइंट-साइड पर सेवा का उपयोग करने के लिए बनाया गया ऑब्जेक्ट था। तो मान लें कि आप कई सेवा कॉल करने के लिए एक डब्ल्यूसीएफ प्रॉक्सी का उपयोग करते हैं, स्थिर वर्ग (सर्वर पक्ष पर) वही रहेगा। मैं तब तक इसकी सलाह नहीं दूंगा जब तक कि सेवा कॉल संबंधित न हों। आपके दूसरे प्रश्न के बारे में, मुझे वैश्विक चर बनाए रखने के लिए विंडोज सेवा का उपयोग करने का विचार पसंद है। पहले इसका इस्तेमाल नहीं किया है, लेकिन इसे आज़माएं। – Channs

+0

मैं इसे समझता हूं। आपका सुझाव देने के लिए धन्यवाद। – John