2012-12-06 14 views
8

मैं WCF सेवा AJAX ग्राहक द्वारा खपत सोप ​​का उपयोग कर 1,2क्यों InstanceContextMode.PerSession wsHttp बाइंडिंग का उपयोग करते समय PerCall की तरह व्यवहार करता है?

Web.config:

<endpoint address="" binding="wsHttpBinding" 
contract="WcfService1.IService1" bindingConfiguration="wsHttpBin"> 

<wsHttpBinding> 
    <binding name="wsHttpBin"> 
    <security mode="None"/>   
    </binding> 
</wsHttpBinding> 

से मैं क्या read है, मैं "wsHttpBinding" बाइंडिंग के साथ संपर्क में एक सेवा के बाद से <security mode="None"/> उपयोग करने के लिए वेब सेवा विनिर्देशों के डब्ल्यूएस- * परिवार के डब्लूएस-सुरक्षा लागू करता है। चूंकि बाध्यकारी सुरक्षा का उपयोग करता है, अनुरोध अस्वीकार कर दिया जाएगा क्योंकि AJAX सुरक्षा संदर्भ का समर्थन नहीं करता है।

मेरे WCF सेवा व्यवहार InstanceContextMode.PerSession साथ परिभाषित किया गया है:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
       InstanceContextMode = InstanceContextMode.PerSession)] 

लेकिन जब मैं यह उपभोग करते हैं, PerCall और हर कॉल के रूप में सेवा व्यवहार के बजाय वर्तमान उदाहरण का उपयोग करने का एक नया WCF उदाहरण शुरू होता है।

क्यों InstanceContextMode.PerSession wsHttp बाइंडिंग का उपयोग करते समय PerCall की तरह व्यवहार करता है?

मैं क्या कर सकता हूं?

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/4767102/wcf-sessions-with-a-wshttpbinding-and-without-windows-security – ErnieL

+0

@ErnieL धन्यवाद लेकिन <विश्वसनीय सत्र सक्षम = "सत्य" /> का उपयोग करना मेरे लिए एक विकल्प नहीं है क्योंकि यह मेरे AJAX क्लाइंट के साथ काम नहीं करेगा। –

+0

स्वयं wsHttp बाइंडिंग सत्रों का समर्थन नहीं करता है। – ErnieL

उत्तर

3

सत्र, जब HTTP पर उपयोग किया जाता है, केवल सुरक्षा सत्र या विश्वसनीय सत्रों का उपयोग करते समय डब्ल्यूसीएफ द्वारा समर्थित होते हैं। यदि आप या तो उपयोग नहीं कर सकते हैं तो आपको अपने द्वारा एक सत्र तंत्र को लागू करना होगा। यदि आप क्लाइंट और सर्वर दोनों पक्षों को नियंत्रित करते हैं, तो यह करना काफी आसान होगा। यहां बताया गया है कि:

उस कक्षा को बनाएं जिसमें आपके द्वारा संग्रहीत सभी सत्र डेटा संग्रहीत किए जाएं (चलिए इसे SessionData पर कॉल करें), साथ ही सत्र के आखिरी बार उपयोग किए जाने के लिए अतिरिक्त DateTime भी बनाएं। फिर अपनी सेवा कक्षा (या किसी अन्य वर्ग) में staticConcurrentDictionary<string, SessionData> जोड़ें।

जब कोई ग्राहक आपकी सेवा पर कॉल करता है, तो उसे सत्र की पहचान करने वाली एक अद्वितीय स्ट्रिंग को पास करने की आवश्यकता होती है (इसे क्लाइंट पक्ष पर यादृच्छिक रूप से जेनरेट किया जा सकता है)। जब भी कोई ग्राहक आपको सेवा कहता है, तो शब्दकोश में सत्र स्ट्रिंग को देखें और सत्र डेटा पुनर्प्राप्त करें (और इसकी सामग्री को आवश्यकतानुसार अपडेट करें)। यदि यह अस्तित्व में नहीं है, तो शब्दकोश में एक नई प्रविष्टि बनाएं। साथ ही, जब भी आप SessionData ऑब्जेक्ट तक पहुंचते हैं, तो वर्तमान समय में 'अंतिम उपयोग' DateTime अपडेट करें। एक पृष्ठभूमि कार्य को समय-समय पर पुराने सत्रों को साफ़ करना चाहिए जिनका उपयोग थोड़ी देर में नहीं किया गया है।

यही है - आपने अपने आप सत्रों को लागू किया है। अब आप InstanceContextMode.Single का उपयोग कर सकते हैं और डब्ल्यूसीएफ के बारे में चिंता नहीं कर सकते हैं प्रति सत्र आपकी सेवा कक्षा के सही तरीके से उदाहरण बनाते हैं।

संपादित: आप .NET 4.5 के साथ अपने WCF सेवा लिख ​​रहे हैं और आप वेब अनुप्रयोग केवल आधुनिक ब्राउज़रों लक्षित है तो आप सर्वर साइड पर NetHttpBinding उपयोग कर सकते हैं और WebSocket क्लाइंट की तरफ। NetHttpBinding सत्र का समर्थन करता है (SessionMode.Required निर्दिष्ट करते समय)।

+0

+1: आपके सुझाव को शुरू करने के लिए दोषपूर्ण नहीं कह रहा है, लेकिन उत्पादन तैयार सत्र तंत्र को लागू करने के लिए मुद्दों पर विचार करने या देखभाल करने के लिए मुद्दों का एक पूरा बैग है: जैसे सत्र अपहरण (आकस्मिक या उद्देश्य पर), वास्तविक सत्र समय-समय पर सर्वर, पुनरारंभ (नियोजित या अनियोजित/दुर्घटना), एकाधिक, समवर्ती अनुरोधों आदि द्वारा सत्र (डेटा) के समवर्ती संशोधन, –

+0

@ ईसाई.के: बहुत ही आपके आवेदन, सत्र (डेटा) दृढ़ता/लचीलापन के लिए समझ में आता है। सच। मुझे विश्वास नहीं है कि आखिरी दो चीजें डब्लूसीएफ द्वारा प्रदान की जाती हैं। सुरक्षा वास्तव में विचार करने का मुद्दा है, और थ्रेड सुरक्षा के लिए मैंने माना है कि प्रत्येक ग्राहक एक अद्वितीय सत्र कुंजी उत्पन्न करेगा और किसी भी समय सेवा के लिए सबसे अधिक कॉल पर प्रदर्शन करेगा, लेकिन अगर ऐसा नहीं है कि थ्रेड सुरक्षा और शुद्धता की भी देखभाल की जानी चाहिए। –

+0

@AllonGuralnek InstanceContextMode.Single का उपयोग नहीं कर रहा है मेरे प्रदर्शन पर बड़ा प्रभाव होगा? –

0

यह link आपको इस बारे में बहुत कुछ बताता है (सामान्य रूप से)।

लेकिन सटीक के लिए।

वे स्पष्ट रूप से शुरू की और बुला आवेदन

मुझे कहना पड़ेगा कि मैं किसी भी जे एस कोड/रूपरेखा है कि आप की दुकान करने की अनुमति होगी के बारे में पता नहीं है इन्हें समाप्त कर रहे हैं: MSDN WCF सत्र के बारे में कहते हैं आपके "सत्र" को जीवित रखने के लिए स्पष्ट रूप से डब्लूसीएफ संचार चैनल खोला गया। (आपने अपना क्लाइंट कोड प्रदान नहीं किया है इसलिए मुझे कुछ धारणाएं करनी होंगी)। डब्ल्यूसीएफ सत्र "कुकी-आधारित" नहीं है। यह आपके ब्राउज़र से "बॉक्स से बाहर" काम नहीं करता है जैसे कि यह एएसपी.नेट वेब एप्लिकेशन के लिए होगा।

InstanceContextMode.PerSession सेट करना आपकी डब्ल्यूसीएफ सेवा "सत्र तैयार" बनाता है लेकिन सत्र को "बल" करने के लिए पर्याप्त नहीं है।

+0

एएसपी.नेट के लिए "कुकी-आधारित" के बारे में आपका क्या मतलब है? अगर मैं जोड़ दूंगा तो क्या मैं इसका उपयोग कर सकता हूं? क्या मैं "बॉक्स से बाहर" समाधान कर सकता हूं। –

संबंधित मुद्दे