2012-04-10 10 views
6

के सभी ब्राउज़र उदाहरणों मैं एक आवेदन उपयोगकर्ता को सूचित करने के लिए जब वे एक नई सूचना प्राप्त की जरूरत है पर काम कर रहा हूँ करने के लिए पुश सूचनाएं। एप्लिकेशन Azure पर होस्ट किया जाएगा और .NET MVC 3 (शायद महत्वपूर्ण नहीं है, लेकिन FYI) होगा। मैं भीSignalR एकल प्रमाणित उपयोगकर्ता

सूचनाएं एक MSSQL डाटाबेस (2008) में बचाया और एक IsRead क्षेत्र है कर रहे हैं। विभिन्न उपयोगकर्ता और सर्वर क्रियाओं से अधिसूचनाएं उत्पन्न होती हैं। उपयोगकर्ता वरीयताओं के आधार पर, कुछ नोटिफिकेशन IsRead == false के साथ बनाए जाएंगे।

2 विभिन्न परिदृश्यों कि मुझे लगता है कि SignalR से निपटने में सही होगा, मैं सिर्फ एक छोटे से मार्गदर्शन की आवश्यकता:

  1. उपयोगकर्ता कई खिड़कियों साइट और एक नई अधिसूचना पंक्ति ब्राउज़ कर खुला जोड़ा जाता है, सौंपा है कि उपयोगकर्ता, IsRead == true
    • साथ करने के लिए मैं एक विशिष्ट js समारोह एक अधिसूचना प्रकट करने के लिए कहा जाता है करने के लिए सभी विशिष्ट उपयोगकर्ता के ब्राउज़र उदाहरणों चाहते हैं पॉप अप
  2. उपयोगकर्ता कई हवा है ओपन ओपन और अधिसूचना पॉप पर क्लिक करता है।
    • मैं एक विशिष्ट js समारोह अधिसूचना पॉप अप को हटाने के लिए कहा जाता है करने के लिए सभी विशिष्ट उपयोगकर्ता के ब्राउज़र उदाहरणों चाहते हैं। (केवल विशिष्ट ब्राउज़र उदाहरण हैं कि क्लिक संभाला भी एक js समारोह निष्पादित करेंगे अधिसूचना विवरण दिखाने के लिए)

क्या मैं


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

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

अगर वहाँ ASP.NET के आधार पर SignalR ग्राहकों का ट्रैक रखने के लिए एक रास्ता है फॉर्म्स प्रमाणीकरण प्रयोक्ता नाम है, तो मुझे लगता है कि दोनों स्थितियों में समस्याओं को सुलझाने में काम करेंगे।

टी एल; डॉ


मेरा मुख्य समस्या मैं SignalR का उपयोग कर एक विशिष्ट उपयोगकर्ता के ब्राउज़र उदाहरणों के सभी संकेत करने के लिए पता नहीं कैसे है। मैं ASP.NET प्रपत्र प्रमाणीकरण उपयोगकर्ता नाम के आधार पर समूह बनाने के बारे में सोच रहा था। क्या यह काम करेगा? क्या सिग्नलआर में बनाया गया एक आसान तरीका है जो इसे संभालता है?

उत्तर

15

आपका कॉल के साथ उपयोगकर्ता नाम एक समूह बनाने के लिए एक कुंजी के रूप में अच्छा एक है और मुझे लगता है कि यह सबसे अधिक लागू करने के लिए तेज है।

$.connection.hub.start(function() { 
    yourHub.register(); 
}); 

और पीछे कोड में हब में:: आप करने के लिए सदस्यता लेने के द्वारा एक समारोह हर बार एक पृष्ठ लोड (और ConnectionId बदल जाता है) कॉल कर सकते हैं

public void Register() 
{ 
    AddToGroup(username); 
} 

और आप करना चाहते हैं ग्राहक की स्क्रीन ताज़ा कर लें:

Clients[username].refreshClientScreen(); 

कहाँ refreshClientScreen() अपने जावास्क्रिप्ट है फ़ंक्शन जो ब्राउज़र में अधिसूचना छिपाने का काम करता है।

ऐसा करने का एक और तरीका है प्रत्येक अनुरोध पर कनेक्शन आईडी जांचना और उस स्थान पर जहां आप पंजीकरण करते हैं और सर्वर पर उपयोगकर्ता के कनेक्शन को जारी रखते हैं। आप उनमें से हर एक पर इस कोड का उपयोग कर सकते हैं जब आप उन्हें अद्यतन करने की आवश्यकता:

Clients[ConnectionId].refreshClientScreen(); 

आप एक हब के प्रसंग वस्तु में ConnectionId पा सकते हैं।

मुझे लगता है कि दूसरा दृष्टिकोण को लागू करने क्योंकि आप का प्रबंधन करने के जहां ConnectionId -s बचाने के लिए और IDisconnect को लागू करने से डिस्कनेक्ट घटना की सदस्यता चाहते हैं तो आप अपने ConnectionId -s सूची को बनाए रखने कर सकते हैं कठिन है आज तक, इसलिए मैं पहला दृष्टिकोण चुनूंगा - समूह के साथ एक।

+0

आपकी टिप्पणी के लिए धन्यवाद। मैं इसे आज़माउंगा और देख सकता हूं कि यह कैसे काम करता है! –

+0

यह बहुत अच्छा काम किया! धन्यवाद :) –