2011-01-22 17 views
11

मुझे आईआईएस में होस्ट की गई डब्ल्यूसीएफ सेवा बनाने की ज़रूरत है, http ट्रांसपोर्ट का उपयोग करता है और सर्वर की मेमोरी में स्थिति पकड़ता है। जबकि मुझे पता है कि राज्यव्यापी सेवाएं एक अच्छा विचार नहीं है, सेवा को विरासत क्लाइंट के साथ काम करने के लिए यह अंतिम बाधा आवश्यक है।डब्ल्यूसीएफ सत्र एक wsHttp बाइंडिंग के साथ और विंडोज़ सुरक्षा के बिना

मेरा पहला विचार मूल्यों को स्टोर करने के लिए एएसपीनेट के सत्र के लिए था। मैंने अपनी सेवा में एएसपीनेट संगतता मोड को सक्रिय किया, जिसने मुझे HttpContext तक पहुंच प्रदान की, लेकिन सत्र ऑब्जेक्ट में रखे गए मान स्मृति में नहीं बने रहे थे। मुझे लगता है कि ऐसा इसलिए था क्योंकि सत्र स्थिति को संभालने वाला http मॉड्यूल सही ढंग से कॉन्फ़िगर नहीं किया गया था, लेकिन जब उत्तर के लिए googling मैं डब्ल्यूसीएफ सत्रों में आया, और सोचा कि यह उनका उपयोग करने के लिए एक बेहतर विचार हो सकता है।

हालांकि, डब्ल्यूसीएफ सत्रों में प्रतीत होता है कि कौन सा दस्तावेज है और सेवा पर एक अजीब सेट का अजीब सेट रखता है, और मैं अपनी आवश्यकताओं के अनुरूप कॉन्फ़िगरेशन नहीं ढूंढ पा रहा हूं: आईआईएस में होस्ट किया जाना चाहिए, http या https परिवहन और विंडोज प्रमाणीकरण पर उत्तर नहीं दे सकता क्योंकि क्लाइंट और सर्वर एक ही डोमेन का हिस्सा नहीं होंगे। मैं इसे wsHttp बाइंडिंग का उपयोग करने की कोशिश कर रहा हूं, मैंने डब्ल्यूसीएफ सत्रों को या तो सुरक्षा या विश्वसनीय संदेश की आवश्यकता थी, लेकिन: - मानक बाध्यकारी का उपयोग करना और जब सर्वर एक ही डोमेन का हिस्सा नहीं हैं, तो यह "सुरक्षा चेतावनी अपवाद" के साथ विफल रहता है। कॉलर सेवा "अपवाद द्वारा प्रमाणित नहीं किया गया था। यह काफी तार्किक है क्योंकि यह विंडोज सुरक्षा का उपयोग कर रहा था।

  • मैं को निष्क्रिय सुरक्षा को पूरा यह विफल रहता है के साथ एक "अनुबंध सत्र आवश्यकता है, लेकिन बाइंडिंग 'WSHttpBinding' इसका समर्थन नहीं करता है या यह समर्थन करने के लिए ठीक से कॉन्फ़िगर नहीं है।"

  • है, जबकि रखते हुए हैं सुरक्षा अक्षम मैं विश्वसनीय संदेश सक्षम करता हूं मुझे अपवाद मिलता है "बाध्यकारी सत्यापन विफल रहा क्योंकि WSHttp बाइंडिंग परिवहन सुरक्षा (HTTPS) पर विश्वसनीय सत्रों का समर्थन नहीं करती है। चैनल फैक्ट्री या सर्विस होस्ट खोला नहीं जा सका। HTTP पर सुरक्षित विश्वसनीय संदेश भेजने के लिए संदेश सुरक्षा का प्रयोग करें। "

  • मैं परिवहन स्तर की सुरक्षा को सक्षम करने की कोशिश की है, लेकिन इस त्रुटि के लिए कोई अंतर उत्पन्न

बनाने के लिए प्रतीत नहीं होता है वहाँ किसी भी विन्यास है कि मेरे लिए काम कर सकता है? या मुझे एएसपीनेट सत्रों का उपयोग करने की योजना पर वापस जाना चाहिए?

+0

मिले कि asp.net सत्र काम नहीं कर कारण कुकीज़, विकलांग जा रहा है asp.net सत्र का उपयोग कर कोड की एक काम संस्करण है था। – Robert

उत्तर

25

आप डब्ल्यूसीएफ होल्डिंग सत्र जानकारी को स्मृति में एक बहुत ही सरल तरीके से रख सकते हैं। मेरे निर्देशों में किसी भी संभावित बाहरी प्रभाव को खत्म करने के लिए, मुझे लगता है कि आप एक ब्रांड नई परियोजना से शुरू कर रहे हैं:

  1. एक नई डब्ल्यूसीएफ सेवा लाइब्रेरी प्रोजेक्ट बनाएं। इस प्रोजेक्ट में पहले से ही WSHttpBiding बाध्यकारी प्री-कॉन्फ़िगर किए गए एक सेवा होगी।
  2. सेवा अनुबंध पर जाएं (IService1.cs) और निम्न के ServiceContract विशेषता बदली:

    [ServiceContract(SessionMode = SessionMode.Required)] 
    
  3. सेवा implimentation (Service1.cs) पर जाएं और सेवा के लिए निम्न ServiceBehavior विशेषता जोड़ें वर्ग (Service1):

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] 
    
  4. सेवा वर्ग के सदस्य के रूप में सत्र डेटा जोड़ें (Service1):

    public class Service1 : IService1 
    { 
        ... 
    
        private string UserFullName { get; set; } 
    
        ... 
    } 
    
  5. सत्र विशिष्ट डेटा पेश करने के लिए सदस्यों का उपयोग करें (यह भी सेवा अनुबंध, IService1 जोड़ने के लिए उन्हें याद):

    public class Service1 : IService1 
    { 
        ... 
    
        public string Welcome(string fullName) 
        { 
         UserFullName = fullName ?? "Guest"; 
         return string.Format("Welcome back, {0}!", UserFullName); 
        } 
    
        public string Goodbye() 
        { 
         return string.Format("Come back soon, {0}!", UserFullName ?? "Guest"); 
        } 
    
        ... 
    } 
    

SessionMode.Required सुनिश्चित करता है कि अपने ग्राहकों को सत्र ट्रैक कर रहे हैं।
InstanceContextMode.PerSession यह सुनिश्चित करता है कि प्रत्येक सत्र के लिए आपकी सेवा कक्षा (सेवा 1) का एक उदाहरण बनाया गया है, ताकि आप इसमें सत्र डेटा बनाए रख सकें और यह उसी सत्र में कई कॉलों में स्मृति में मौजूद रहेगा।
ConcurrencyMode.Single यह सुनिश्चित करता है कि केवल एक थ्रेड प्रत्येक सेवा वर्ग उदाहरण (सेवा 1) में प्रवेश कर सके, और यदि आप केवल सेवा वर्ग (और बाहरी थ्रेड-सुरक्षित स्थानों) से डेटा तक पहुंचते हैं तो संभावित समवर्ती मुद्दों को रोकता है।

संपादित करें: डिफ़ॉल्ट रूप से, WSHttpBinding केवल सुरक्षा सत्रों की अनुमति देता है। लेकिन यह विश्वसनीय सत्रों का भी समर्थन करता है, जो सुरक्षा सक्षम किए बिना सत्र स्थापित करने की अनुमति देता है। निम्नलिखित बाध्यकारी विन्यास सुरक्षा अक्षम कर देता है और विश्वसनीय सत्र सक्षम बनाता है:

<wsHttpBinding> 
    <binding name="wsHttpBindingConfiguration"> 
     <security mode="None" /> 
     <reliableSession enabled="true" /> 
    </binding> 
</wsHttpBinding> 
+0

यह मैंने जितना कम या कम किया है, ऐसा लगता है कि इसे काम करने के लिए संदेश स्तर विंडोज प्रमाणीकरण की आवश्यकता है। यह मेरे लिए एक विकल्प नहीं है क्योंकि क्लाइंट और सर्वर एक ही डोमेन में नहीं होंगे। – Robert

+0

@Robert: सही है, लेकिन एक समाधान है। मेरे उत्तर पर संपादन देखें। मुझे आशा है कि यह आपकी समस्या हल करेगी। –

+0

क्लाइंट पर आपके सुझाए गए कॉन्फ़िगरेशन का उपयोग करके मुझे निम्न त्रुटि मिलती है। प्रोटोकॉल अपवाद: रिमोट एंडपॉइंट ने नेमस्पेस के साथ एक अपरिचित गलती भेजी है, http://www.w3.org/2003/05/soap-envelope, नाम प्रेषक, और कारण संदेश संसाधित नहीं किया जा सका। यह सबसे अधिक संभावना है क्योंकि कार्रवाई 'http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence' गलत है या क्योंकि संदेश में एक अमान्य या कालबाह्य सुरक्षा संदर्भ टोकन है या क्योंकि .. – Robert

1

आईएमओ यह तब होता है जब आप डब्ल्यूसीएफ जैसे HTTP पर खराब अबास्ट्रक्शन के साथ तकनीक का उपयोग कर रहे होते हैं। तथ्य यह है कि डब्ल्यूसीएफ वेब सेवाओं को सिद्धांत के बिना होस्ट किया जा सकता है (यानी एनईटी टीसीपी, एमएसएमक्यू, आदि पर) बस कॉन्फ़िगरेशन नरक में प्रवेश किए बिना HTTP की अंतर्निहित सुविधाओं का उपयोग करना मुश्किल बनाता है और "सही कॉन्फ़िगरेशन का अनुमान लगाने का एक गेम शुरू करना परीक्षण और त्रुटि से "जहां आप हर संभव कॉन्फ़िगरेशन क्रमपरिवर्तन का प्रयास करते हैं जब तक आपको सही काम नहीं मिल जाता है!

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

एक संभव समाधान यदि आप उपयोग करने के लिए WCF अपने खुद के हाथ में सत्र प्रबंधन लेने के लिए है था और एक स्पष्ट 'सत्र (यह मैं क्या कर जब मैं दुखी हूँ प्रयास के साथ काम करने के लिए कुछ पाने के लिए आवश्यक है) 'आपकी सभी वेब सेवाओं पर संपत्ति जिसके लिए सत्र/प्रमाणीकरण की आवश्यकता होती है (आमतौर पर प्रमाणीकरण पर उत्पन्न एक guid)। इसलिए प्रत्येक बाद के अनुरोध के लिए आप उस ग्राहक से जुड़े सत्र की जानकारी को पुनर्जीवित करने के लिए गाइड का उपयोग करें।

आप विभिन्न वेब सेवा चौखटे से बाहर की कोशिश कर रहा में रुचि रखते मैं एक Open Source Web Services Framework आप विन्यास से मुक्त बनाने की सुविधा देता है कि बनाए रखने रहे हैं, सूखी, परीक्षण योग्य वेब सेवाओं जहां (अपेक्षित किसी भी विन्यास के बिना) प्रत्येक वेब सेवा आपके द्वारा बनाए गए बाकी हिस्सों में स्वचालित रूप से पहुँचा जा सकता है एक्सएमएल, जेएसओएन, जेएसवी, एसओएपी 1.1, एसओएपी 1.2 एंडपॉइंट्स। प्रभावी रूप से यह आपको आरईएसटी-फुल क्लाइंट्स और आसान डीबगिंग के साथ-साथ एसओएपी एंडपॉइंट्स (कुछ उद्यमों द्वारा अभी भी एक लोकप्रिय विकल्प के लिए अनिवार्य) के लिए HTTP GET url के माध्यम से अपनी वेब सेवा तक पहुंचने की अनुमति देता है। Hello World ट्यूटोरियल आपको इसकी कुछ विशेषताओं और यह कैसे काम करता है पर एक अच्छा अवलोकन प्रदान करना चाहिए।

+0

उत्तर के लिए धन्यवाद! हालांकि मैं आपके जवाब के साथ काफी हद तक सहमत हूं, यह परियोजना की दुर्भाग्यपूर्ण बाधा है कि हमें डब्ल्यूसीएफ का उपयोग करना है। मैं निश्चित रूप से प्रोजेक्ट्स के लिए सर्विसस्टैक पर एक नज़र डालेगा जिसमें तकनीकों पर कम कठोर बाधाएं होंगी। – Robert

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