2012-09-02 6 views
7

Hy,SignalR - हैंडलिंग कट उपयोगकर्ताओं

मैं एक अधिसूचना संभालने के लिए और मॉड्यूल चैट करने के लिए एक परियोजना पर signalR लाइब्रेरी का उपयोग कर रहा हूँ। मेरे पास ऑनलाइन उपयोगकर्ताओं का ट्रैक रखने के लिए डेटाबेस पर एक टेबल है।

चैट के लिए हब आईडीआईकनेक्ट विरासत में है जहां मैं उपयोगकर्ता को डिस्कनेक्ट करता हूं। उपयोगकर्ता को डिस्कनेक्ट करने के बाद, मैं उस घटना के बारे में उपयोगकर्ताओं को गर्म करता हूं। इस बिंदु पर, मैं जांचता हूं कि डिस्कनेक्ट उपयोगकर्ता क्लाइंट है या नहीं। यदि ऐसा है, तो मैं उपयोगकर्ता को पुनः कनेक्ट करने के लिए HUB पर एक विधि को कॉल करता हूं (बस तालिका अपडेट करें)।

मैं ऐसा इसलिए करता हूं क्योंकि वर्तमान कार्यान्वयन के साथ, जब उपयोगकर्ता ब्राउज़र पर एक टैब बंद करता है तो यह डिस्कनेक्ट कार्य को कॉल करता है लेकिन उसके पास एक और टैब खोला जा सकता है।

मैंने अभी तक इस मॉड्यूल का परीक्षण नहीं किया है (लेकिन बड़े अनुरोधों के साथ), लेकिन मेरे विकास सर्वर पर आईडीआईकनेक्ट घटना के बीच कुछ सेकंड लग सकते हैं, और उपयोगकर्ता से अनुरोध फिर से कनेक्ट करने के लिए।

मैं चैट से डिस्कनेक्ट किए गए उपयोगकर्ताओं को संभालने के लिए अपने कार्यान्वयन से चिंतित हूं लेकिन मुझे इसे सुधारने का कोई और तरीका नहीं दिख रहा है।

यदि संभव हो, तो क्या कोई मुझे इस पर सलाह दे सकता है, या यह मेरा एकमात्र समाधान है?

अद्यतन: मैं सभी उपयोगकर्ताओं और उनके कनेक्शन आईडी को सिग्नलर से स्टोर करने के लिए एक सिंगलटन क्लास का उपयोग कर समाप्त हुआ। इस तरह मैं डिस्कनेक्ट कार्य के दौरान उपयोगकर्ता से आईडी प्राप्त कर सकता हूं (इस बिंदु पर आपके पास उपयोगकर्ता की जानकारी प्राप्त करने के लिए कोई httpcontext नहीं है, लेकिन आप हमेशा सिंगलटन में सरणी से सिग्नलर की कनेक्शन आईडी के साथ उपयोगकर्ता आईडी प्राप्त कर सकते हैं कक्षा)।

20-02-2013 हालांकि उपर्युक्त समाधान नौकरी कर रहा था, मुझे अपनी परियोजना को स्केल करने की आवश्यकता थी। मेरा समाधान सभी उपयोगकर्ता कनेक्शनों को स्टोर करने के लिए रेडिस का उपयोग करना था, और डिस्कनेक्ट घटनाओं पर महत्वपूर्ण समाप्ति समय का लाभ उठाना था। पुन: कनेक्ट करने के दौरान मैं जांचता हूं कि कुंजी लंबित स्थिति में है (कुछ मिनटों में समाप्त हो जाएगी)।

+0

एक साल बाद मुझे पाइथन के साथ निर्मित एफबी टोरनाडो मिला और गैर-ब्लॉकिंग पैटर्न के बाद मैंने अलविदा सिग्नलर कहा है;) –

उत्तर

5

आप देख सकते हैं कि कैसे JabbR, एक बहु कमरे चैट एप्लिकेशन SignalR के शीर्ष पर बनाया गया, इस समस्या का हल: https://github.com/JabbR/JabbR/blob/master/JabbR/Hubs/Chat.cs

यह मूल रूप से एक 1 रहता है: उपयोगकर्ता < के एन मानचित्रण -> ConnectionId, इसलिए जब अंतिम कनेक्शन डिस्कनेक्ट किया गया है जिसे उपयोगकर्ता को "ऑफलाइन" के रूप में चिह्नित किया जा सकता है।

+0

आपको बहुत धन्यवाद, यह परियोजना वास्तव में सहायक है। मैं टाइमआउट दृष्टिकोण का पालन करूंगा –

+0

क्या आप किसी भी "कैसे JabbR ... इस समस्या को हल करता है" को आपके उत्तर में रेखांकित कर सकते हैं? –

+0

@MichaelPaulukonis यह मूल रूप से 1: N मैपिंग उपयोगकर्ता <-> कनेक्शन आईडी रखता है, इसलिए जब अंतिम कनेक्शन डिस्कनेक्ट हो जाता है तो उपयोगकर्ता को "ऑफलाइन" के रूप में चिह्नित किया जा सकता है। –