2011-11-17 11 views
16

एक .NET 4.0 सिस्टम में अधिसूचनाओं को लागू करने के लिए सिग्नल का उपयोग कैसे किया जाएगा जिसमें एएसपी.नेट एमवीसी 3 एप्लीकेशन (जो फॉर्म का उपयोग करता है) प्रमाणीकरण), एसक्यूएल सर्वर 2008 डेटाबेस और डेटा को संसाधित करने के लिए एक एमएसएमक्यू डब्ल्यूसीएफ सेवा (डब्ल्यूएएस में होस्ट किया गया)? रनटाइम पर्यावरण में आईआईएस 7.5 विंडोज सर्वर 2008 आर 2 मानक संस्करण पर चल रहा है।एएसपी.नेट एमवीसी 3 से वेब क्लाइंट को सूचित करने के लिए सिग्नलआर का उपयोग कैसे करें कि एमएसएमक्यू कार्य पूरा हो गए हैं

मैंने केवल नमूने के साथ खेला है और सिग्नलआर का व्यापक ज्ञान नहीं है।

यहाँ कुछ पृष्ठभूमि

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

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

अधिकांश समय, डब्ल्यूसीएफ सेवा किसी भी प्रसंस्करण नहीं कर रही है, हालांकि जब ऐसा होता है, तो उपयोगकर्ता आमतौर पर जानना चाहते हैं कि यह जल्द से जल्द कब किया जाता है। उपयोगकर्ता अभी भी वेब एप्लिकेशन के अन्य हिस्सों का उपयोग करेगा, भले ही उनके पास डब्ल्यूसीएफ सेवा द्वारा संसाधित किए जाने वाले डेटा न हों।

यह मैं

क्या किया है प्राथमिक नेविगेशन बार में है, मैं उपयोगकर्ता के लिए एक संकेतक (फेसबुक या गूगल + के समान) जब कार्यों की स्थिति बदल गई है उन्हें सूचित करने के लिए है। जब वे उस पर क्लिक करते हैं, तो उन्हें सारांशित किया जाता है कि क्या किया गया था और फिर वे परिणाम देख सकते हैं।

jQuery का उपयोग करके, मैं परिवर्तन के लिए सर्वर को मतदान करता हूं। नियंत्रक कार्रवाई यह देखने के लिए जांचती है कि क्या कोई ऐसी प्रक्रिया है जो संशोधित (पूर्ण या असफल) थी और उन्हें वापस लौटाती है अन्यथा कुछ सेकंड प्रतीक्षा करती है और क्लाइंट पर वापस लौटने के बिना फिर से जांचती है। क्लाइंट पर समय निकालने से बचने के लिए, यदि कोई बदलाव नहीं हुआ तो यह 30 सेकंड के बाद वापस आ जाएगा। JQuery स्क्रिप्ट थोड़ी देर प्रतीक्षा करती है और फिर कोशिश करती है।

समस्याओं

प्रदर्शन प्रत्येक उपयोगकर्ता है कि एक पृष्ठ विचारों के साथ गिरावट होती है। विशेष रूप से कुछ भी करने की उनकी आवश्यकता नहीं है। हमने देखा है कि फ़ायरफ़ॉक्स 7+ और सफारी के स्मृति उपयोग समय के साथ बढ़ता है।

SignalR

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

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

+0

के लिए कोई भी सुझाव [इस] (http://stackoverflow.com/q/34090045/2404470) – xameeramir

उत्तर

8

अगर मैं सही ढंग से समझ, आप किसी दिए गए उपयोगकर्ता/ग्राहक के लिए एक कार्य जोड़ ताकि आप ग्राहक जब उनके कार्य पूरा कर लिया है बता सकते हैं का एक तरीका की जरूरत है।

SignalR API दस्तावेज़ मुझसे कहता है आप ग्राहक आईडी (https://github.com/SignalR/SignalR/wiki/SignalR-Client) के आधार पर विशिष्ट ग्राहकों के लिए जे एस तरीकों कॉल कर सकते हैं।

  1. स्टोर ग्राहक कार्य मेटाडाटा के हिस्से के रूप SignalR द्वारा प्रयोग किया जाता आईडी:
  2. कतार सामान्य रूप में कार्य सिद्धांत रूप में आप की तरह कुछ कर सकता है।
  3. जब कार्य संसाधित किया जाता है और डी-कतार में: स्थिति के साथ अपने डेटाबेस
    • अद्यतन।

आप कनेक्शन है कि आपके ग्राहक उपयोग कर रहा है को पुनः प्राप्त है और उन्हें एक संदेश भेजने के लिए सक्षम होना चाहिए:

  • ग्राहक उस कार्य का हिस्सा के रूप में जमा आईडी का उपयोग करना, कि ग्राहक सूचना भेजने के लिए SignalR का उपयोग :

    string clientId = processedMessage.ClientId //Stored when you originally queued it. 
    IConnection connection = Connection.GetConnection<ProcessNotificationsConnection>(); 
    connection.Send(clientId, "Your data was processed"); 
    

    इसका मतलब यह है कि आप इस संबंध मैप किया गया है और ग्राहक है कि कनेक्शन का इस्तेमाल किया पहली जगह में डाटा प्रोसेसिंग अनुरोध शुरू करने के लिए। आपका "प्राथमिक नेविगेशन पट्टी" जे एस कि ProcessNotificationsConnection endpoint आप पहले मैप किया गया करने के लिए कनेक्शन शुरू कर दिया है।

    संपादित करें: से https://github.com/SignalR/SignalR/wiki/Hubs

    public class MyHub : Hub 
    { 
        public void Send(string data) 
        { 
        // Invoke a method on the calling client 
        Caller.addMessage(data); 
    
        // Similar to above, the more verbose way 
        Clients[Context.ClientId].addMessage(data); 
    
        // Invoke addMessage on all clients in group foo 
        Clients["foo"].addMessage(data); 
        } 
    } 
    
  • +0

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

    +0

    यदि आप एक हब के भीतर काम करते हैं तो यह करता है। संशोधित उत्तर देखें। – PabloC

    +0

    अपने जवाब में काम किया, हालांकि, अंत में मुझे लगता है कि पारदर्शी रूप से सुरक्षा का समर्थन करता है एक कस्टम समाधान के लिए SignalR ड्रॉप करने का फैसला किया। इसलिए, उपयोगकर्ता केवल ऐसे संदेशों को देखने के लिए अधिकृत उपयोगकर्ताओं को अधिसूचनाएं भेज सकता है। यह आवश्यकता मूल प्रश्न का हिस्सा कभी नहीं थी, इसलिए मैंने आपको उत्तर के रूप में चिह्नित किया। – bloudraak