2009-06-24 12 views
6

मैं चैट-जैसे एप्लिकेशन पर काम करता हूं, जहां मैं क्लाइंट साइड पर सिल्वरलाइट का उपयोग करता हूं और सर्वर की ओर wpf का उपयोग करता हूं। अभी संचार सॉकेट पर आधारित है: मेरे पास अलग-अलग संदेश-वर्ग हैं जिन्हें मैं धाराबद्ध करता हूं और टीसीपी के माध्यम से भेजता हूं।सॉकेट बनाम। डब्ल्यूसीएफ

मुझे यह महसूस करना शुरू हो गया है कि प्रत्येक संभावित संचार परिदृश्य के लिए एक अलग संदेश वर्ग बनाना काफी ओवरहेड है और डब्ल्यूसीएफ में जाने पर विचार करें।

इसलिए मैं निम्नलिखित बातें जानने की जरूरत:

  1. ऐसा लगता है कि WCF का उपयोग कर पूरे संचार पर ग्राहकों उजागर मेरी WCF सेवा से तरीकों callind आधारित है। क्या यह जानने का कोई तरीका है कि कौन सा क्लाइंट एक निश्चित विधि कहता है? यह मेरे आवेदन के लिए काफी महत्वपूर्ण है।

  2. क्या डब्ल्यूसीएफ मेरे एप्लिकेशन को सूचित करता है, जब कोई क्लाइंट डिस्कनेक्ट करता है (उदा। सर्वर विंडो को बंद करता है जहां सिल्वरलाइट क्लाइंट चल रहा है) सर्वर से? यह भी काफी महत्वपूर्ण है।

  3. क्या विधि पूरी तरह से असीमित कॉल करती है? यदि हां, तो क्या मुझे सर्वर विधि के मुख्य थ्रेड पर प्रत्येक विधि कॉल को दोबारा करना होगा?

  4. क्या प्रत्येक ग्राहक कनेक्शन का अपना धागा है? क्लाइंट कॉल विधियों में हर 2 सेकंड कहने पर सर्वर कितने एक साथ कनेक्शन (एक उचित रूप से संचालित पीसी पर चल रहा है) संभाल सकता है? मुझे बस एक अनुमान (10, 100, 1000 या इससे भी अधिक) की आवश्यकता है। "अधिक" बहुत अच्छा होगा;)

शायद मैं पूरी तरह से गलत हूं और डब्ल्यूसीएफ कनेक्शन-आधारित काम नहीं करता है। फिर मुझे सक्रिय कनेक्शन की सूची प्रबंधित करने के लिए एक समाधान मिलना होगा।

आपकी मदद के लिए धन्यवाद! कपड़े

+0

मेरे पास आपके लिए ठोस जवाब नहीं हैं, इसलिए मैं इसे एक टिप्पणी में छोड़ दूंगा। मैं बहुत दृढ़ता से सुझाव देता हूं कि आप जुवल लोवी द्वारा "प्रोग्रामिंग डब्ल्यूसीएफ सर्विसेज 2 संस्करण" की प्रतिलिपि लेंगे। उनकी किताबों को आपके सभी सवालों का जवाब देना चाहिए। संक्षिप्त उत्तर: आप निश्चित रूप से डब्ल्यूसीएफ के साथ अपने सभी परिदृश्यों को संभाल सकते हैं। मैंने जो पुस्तक उल्लेख की है उसमें कैसे पाया जा सकता है। –

उत्तर

4
  1. चूंकि आप एक Silverlight अनुप्रयोग का उपयोग कर रहे हैं, तो आप लागू कर सकते हैं एक UserNamePassword सत्यापनकर्ता संदेश परत पर है, जो साबुन संदेश के लिए कुछ हेडर कहते हैं, इस विशिष्ट ग्राहकों की पहचान के लिए इस्तेमाल किया जा सकता जब तक कि ग्राहकों को गुमनाम हैं । तो आप सिस्टम.ServiceModel.OperationContext.Current का उपयोग कर सकते हैं, जब आपको wcf सेवा में कहीं और उपयोगकर्ता नाम तक पहुंचने की आवश्यकता होती है।

  2. क्लाइंट डिस्कनेक्ट करते समय सर्वर को अधिसूचित नहीं किया जाता है, क्योंकि संदेश डिफ़ॉल्ट रूप से "PerCall" होते हैं, इसलिए एक तरीका है, सिंगलटन क्लास का उपयोग InstanceContextMode के साथ आपके सर्विस कंट्रैक्ट के रूप में करें।एकल, फिर कॉलबैक सेवा के साथ एक ऑपरेशन कंट्रैक्ट को कार्यान्वित करें, फिर जब ग्राहक आपकी सेवा में लॉगिन करते हैं तो उन्हें कॉलबैक सेवा के साथ पंजीकरण करना होगा, फिर कॉलबैक सेवा कनेक्ट क्लाइंट के माध्यम से चक्र कर सकती है और कॉलबैक की स्थिति की जांच कर सकती है, चाहे वह अभी भी खुला है या नहीं, आखिरकार उन प्रविष्टियों को हटा दें जहां कनेक्शन बंद हैं, अंत में आप अपनी आवश्यक कार्यक्षमता प्राप्त कर सकते हैं।

  3. Async कॉल, ग्राहक से हैं, यानी। सिल्वरलाइट में सभी webservice कॉल एएसपीसी हैं, जैसे कि एएसपी में आपके पास एक विकल्प है, डब्ल्यूसीएफ स्वचालित रूप से एसिंक कार्यक्षमता को संभालता है, इसलिए आपको कुछ भी फिर से शुरू करने की आवश्यकता नहीं है, बस सर्विसकंट्रैक्ट को अपने एकल थ्रेड की तरह कोड करें, और सब कुछ ठीक होगा

  4. आपके सर्वर और उसके बैंडविड्थ से अधिक लाभ प्राप्त करने के लिए, चांदी की रोशनी 3 में बाइनरी संदेश एन्कोडिंग लागू करें, चांदी की रोशनी कच्चे टीसीपी कनेक्शन का समर्थन नहीं करती है, इसे बहुत अच्छे कारणों से http संदेश में रैप किया जाना है। प्रत्येक क्लाइंट में कई समवर्ती कॉल (async याद रखना) हो सकता है, ताकि चीजों को सरल रखने के लिए, बस इसके बारे में सोचें जैसे कि सर्वर प्रत्येक संदेश कॉल को अलग थ्रेड निर्दिष्ट करता है। तो आपने जो कहा है उस पर अपने प्रश्न का उत्तर देने के लिए, 1000.

+0

इस विस्तृत उत्तर के लिए धन्यवाद :) एक आखिरी सवाल: क्या मेरी वर्तमान विधि (सॉकेट का उपयोग) प्रदर्शन के संदर्भ में डब्ल्यूसीएफ से काफी बेहतर है? यदि आप कहते हैं, डब्ल्यूसीएफ 1000 एक साथ कनेक्शन को संभाल सकता है, तो कितने ग्राहक लगभग संभाल सकते हैं? 2000, 5000 या यहां तक ​​कि 10.000? मुझे उम्मीद है कि प्रत्येक ग्राहक प्रत्येक 1 से 5 सेकंड में एक संदेश भेजने के लिए। –

+0

ठीक है, इसकी तरह, प्रत्येक क्लाइंट जो कनेक्ट करता है, सत्र आईडी प्राप्त करता है, और भेजे गए प्रत्येक संदेश में एक अद्वितीय आईडी होती है, इसलिए सैद्धांतिक रूप से आप सर्वर को देरी कर सकते हैं, काम कर सकते हैं, फिर क्रमबद्ध कर सकते हैं क्योंकि सैद्धांतिक रूप से आप एक साथ कई संदेश भेज सकते हैं प्रतिक्रिया (बैंडविड्थ तक सीमित)। टीसीपी सॉकेट का उपयोग करना http पर बाइनरी एन्कोडिंग पर क्रमबद्ध करने के लिए बहुत कम सामान है, ठीक है, कोई http नहीं है, मध्य व्यक्ति को एप्लिकेशन लेयर काटने और यूआर कोड में अपनी खुद की लीटवेइग परत बनाने का मतलब है। तो इसका मतलब है कि कम deserializing काम और serializing काम, तो आप अधिक संदेश – Neil

+0

अधिक प्रतिक्रिया दे सकते हैं ठीक है, धन्यवाद। –

0

3 के लिए मुझे पता है कि आप async को कॉल कर सकते हैं।

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

0

मेरे उत्तर:

  1. हां। सभी संचार कॉलिंग विधियों पर आधारित है।
  2. सामान्य में - संख्या
  3. आप विधियों को सिंक्रनाइज़ या असीमित रूप से कॉल कर सकते हैं। यह आप पसंद है।
  4. अधिक। मैं सही सिस्टम डिजाइन का मामला।
संबंधित मुद्दे