2012-04-02 6 views
7

यहां मेरी समस्या है, मैं ट्रैक करना चाहता हूं कि उपयोगकर्ता ऑनलाइन या ऑफ़लाइन है या नहीं और इसके बारे में अन्य क्लाइंट को सूचित करें। मैं हब्स का उपयोग कर रहा हूं और आईकनेक्टेड और आईडीिसकनेक्ट इंटरफेस दोनों को कार्यान्वित कर रहा हूं।सिग्नल हब समूह में कनेक्शन की संख्या पाने का कोई तरीका है?

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

मैंने कनेक्शन आईडी के लिए अपने स्वयं के कनेक्शन IDFactory लौटने वाले उपयोगकर्ता नाम का उपयोग करने की कोशिश की लेकिन कुछ बिंदुओं पर खोले गए कई टैब के साथ यह उपयोगकर्ता कनेक्शन डिस्कनेक्ट हो जाएगा और उसके बाद क्लाइंट साइड हब अंतहीन पाश बर्बाद करने वाली स्मृति में हब से असफल रूप से कनेक्ट करने का प्रयास करेगा और सीपीयू बनाने ब्राउज़र लगभग अनुपयोगी। मुझे इसे तेजी से ठीक करने की ज़रूरत है इसलिए मैंने अपना कारखाना हटा दिया और अब मैं उपयोगकर्ता नाम का उपयोग करके समूह में हर नया कनेक्शन जोड़ता हूं, इसलिए मैं आसानी से सभी कनेक्शन पर एकल उपयोगकर्ता को सूचित कर सकता हूं, लेकिन फिर मुझे पता लगाने में समस्या है कि उपयोगकर्ता ऑनलाइन या ऑफलाइन है या नहीं। पता नहीं है कि उपयोगकर्ता के कितने सक्रिय कनेक्शन हैं।

तो मुझे आश्चर्य है कि एक समूह में कनेक्शन की संख्या प्राप्त करने का कोई तरीका है? या अगर किसी के पास कुछ बेहतर विचार है कि उपयोगकर्ता ऑफ़लाइन होने पर ट्रैक कैसे करें?

मैं Signalr 0.4 का उपयोग कर रहा

+0

आप एक शब्दकोश > का उपयोग कर सकते हैं जहां कुंजी उपयोगकर्ता नाम है और हैशसेट में उस उपयोगकर्ता के लिए कनेक्शन आईडी है। # उपयोगकर्ताओं का = Keys.Count(), # कनेक्शन = dict.Values.Sum (x => x.Count()); – drch

+0

साइट को वेब फार्म परिदृश्य में काम करना चाहिए, इसलिए मैं शब्दकोश का उपयोग नहीं कर सकता। मैं डीबी में कनेक्शन स्टोर कर सकता हूं, लेकिन यदि संभव हो तो मैं इससे बचना चाहूंगा। – pajo

+0

जब आप कहते हैं कि उपयोगकर्ता पृष्ठ को रीफ्रेश करता है और उसे नया कनेक्शन आईडी मिलती है, तो मैं अपने डीबी में कनेक्शन आईडी संग्रहीत कर रहा हूं और यदि उपयोगकर्ता मेरी साइट पर दो पेज देखता है जहां मेरा केंद्र समान है तो कनेक्शन आईडी भी वही है। आपको अलग कनेक्शन आईडी क्यों मिल रही है। मुझे लगता है कि क्लाइंट अलग होने पर आप केवल अलग आईडी प्राप्त कर सकते हैं। –

उत्तर

9

वहाँ अपने दम पर गिनती की तुलना में इस अन्य करने के लिए तरीका नहीं है।

3

मिले कैसे वैकल्पिक हल के लिए:

पुनर्लेखन connectionId, इसलिए हर टैब में आप एक ही sonnection आईडी होना चाहते हैं:

public class MyConnectionFactory : IConnectionIdGenerator 
    { 
     public string GenerateConnectionId(IRequest request) 
     { 
      return MyUserManager.Instance.CurrentUserID.ToString(); 
     } 
    } 

Global.asax में जोड़ें:

GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator),() => new MyConnectionFactory()); 

और मैं मैक टैब के रूप में खोलने में कामयाब रहा, जैसा कि मैं कर सकता था। और सभी टैब अधिसूचनाएं प्राप्त करते हैं।

+0

नवीनतम सिग्नल संस्करण के साथ काम नहीं करता है। – kravits88

+0

आप समझने के लिए पूर्ण कोड दे सकते हैं कि कनेक्शन फ़ैक्टरी को कैसे कार्यान्वित किया जाए जो सिग्नलर के लिए नए हैं। धन्यवाद – Mou