2016-10-21 6 views
6

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

प्रलेखन सिर्फ उपयोग का कहना है:

$.connection.hub.start() 
    .done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); }) 
    .fail(function(){ console.log('Could not Connect!'); }); 
}); 

लेकिन इस खाते में डिस्कनेक्ट और अन्य मुद्दों लेने के लिए प्रतीत नहीं होता।

इसके अलावा, यह सत्र की समाप्ति की समस्या को नहीं पकड़ता है और पुनः लॉगिन की आवश्यकता है।

+0

यह प्रश्न राय आधारित है और इस प्रकार स्टैक ओवरफ़्लो के लिए ऑफ-विषय है। –

+0

किसी एपीआई को एक त्रुटि-आधारित तरीके से एक राय आधारित प्रश्न कैसे बुला रहा है?! – Cine

+0

* सिग्नलआर से कनेक्ट करने के लिए सही जावास्क्रिप्ट पैटर्न क्या है ...? * चूंकि सिग्नलआर (हब, लगातार कनेक्शन इत्यादि) से कनेक्ट करने के लिए कोई भी "सही" पैटर्न नहीं है, यह राय का विषय है जो "सबसे सही है "। –

उत्तर

1

एकमात्र तरीका जो मुझे लगता है कि यह किया जा सकता है वह बैकप्लेन का उपयोग करना है जो प्रत्येक जुड़े क्लाइंट की कनेक्शन जानकारी संग्रहीत करता है। उस ने कहा, वे कभी भी "जुड़े रहेंगे" अगर वे इंटरनेट या हाइबरनेट खो देते हैं, तो आप जो भी कर सकते हैं वह "पुनः कनेक्ट" है, आपको डिस्कनेक्शन की स्थिति में लगातार किसी भी राज्य की जानकारी को स्टोर करना होगा, आप इसे नहीं कर सकते "डिस्कनेक्ट" घटना क्योंकि तब तक यह बहुत देर हो चुकी है। एक विकल्प राज्य की जानकारी को रेडिस कैश में लगातार स्ट्रीम करना होगा और समय-समय पर बैक प्लेन को अधिक उचित अंतराल में भेजना होगा, या डिस्कनेक्ट होने पर भी आग लग जाएगी।

+0

लक्ष्य उनके लिए कभी डिस्कनेक्ट नहीं करना है, लक्ष्य यूआई के लिए डिस्कनेक्ट कभी नहीं देखना है (मामले को छोड़कर यदि फिर से लॉगिन करने की आवश्यकता है)। आईई जब यूआई सक्रिय है और एक इनसेट कनेक्शन है, यह जुड़ा हुआ है। – Cine

+0

यह समाधान प्राप्त होगा जो मुझे विश्वास है, बस यह सुनिश्चित करने की आवश्यकता है कि आप यूआई राज्य का प्रबंधन कर रहे हैं, और ऐसा करके आप कनेक्टिविटी में ब्रेक होने पर रेडिस कैश से खींच सकते हैं। –

+0

यूआई राज्यों का प्रबंधन पूरा सवाल है ... – Cine

2

यह देखते हुए कि सिग्नल एक कनेक्शन आधारित क्लाइंट/सर्वर समाधान है, आप लंबे समय तक खुले कनेक्शन की अपेक्षा नहीं कर सकते हैं। इसलिए केल्सो शार्प ने अपने जवाब में लिखा था, एकमात्र अच्छी चीज जो आप कर सकते हैं वह कनेक्शन जीवन चक्र की घटनाओं का प्रबंधन करती है। https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#connectionlifetime

तो अगर हम कैसे एक लगातार कनेक्शन है कि कभी असफल नहीं होता बनाने के लिए पर ध्यान केंद्रित करने नहीं करते, हम बजाय देने पर ध्यान केंद्रित कर सके:

एक signalR कनेक्शन के सभी के जीवन चक्र की घटनाओं के लिए दस्तावेज़ीकरण देखें उपयोगकर्ता उस पर एक छाप, डिस्कनेक्ट, पुनः लोड और पृष्ठभूमि में चालाकी से प्रबंधन करके।

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

यदि डेटा स्थिरता कोई समस्या है, तो आप राज्य के संस्करण को कर सकते हैं, स्थानीय प्रतिलिपि UI में रख सकते हैं, और फिर पुन: कनेक्ट करने पर ऑडिट कर सकते हैं। इस तरह आप देख सकते हैं कि क्या आप किसी चीज़ पर चूक गए हैं, इस मामले में आप राज्य प्रदाता को पकड़ लेना जारी करेंगे। // इस संबंध चक्र के दौरान सभी राज्य में परिवर्तन के लिए ट्रिगर किया जाएगा:

Pattern for faking persistent connection

अपने ग्राहक पक्ष पर घटनाओं तुम सिर्फ कुछ कार्यों में हुक है संभालने के लिए

$.connection.hub.stateChanged(function (change) { 
    if (change.newState === $.signalR.connectionState.reconnecting) { 
     console.log("liveFeed is reconnecting!"); 
    } 
    else if (change.newState === $.signalR.connectionState.connected) { 
     console.log("liveFeed is connected!"); 
    } 
}); 

// इस जब हब से डिस्कनेक्ट हो जाता है तो ट्रिगर होता है।

$.connection.hub.disconnected(function() { 
    console.log('Connection disconnected') 
}); 
+0

आपके पास 'रीकनेक्टिंग' के संबंध में 'डिस्कनेक्ट' होने पर कोई विशिष्टता है। और क्या यह गारंटी है कि यह हमेशा दिनों के अंत तक फिर से कनेक्ट करने का प्रयास करेगा? यदि हां, तो प्रयासों में देरी क्या है? और मैं एक प्रयास को कैसे मजबूर कर सकता हूं? साथ ही, क्या आपको पुनः कनेक्ट प्रयास विफल होने की अधिसूचना मिलती है? – Cine

+0

सत्र की अवधि समाप्त करने के लिए कैसे करें? – Cine

+0

@ अच्छी तरह से आप दस्तावेज़ों को पढ़ते हैं, सभी जीवन चक्र घटनाओं को सूचीबद्ध किया गया है, आप उन घटनाओं के दौरान ट्रिगर करने की उम्मीद कर सकते हैं। रीट्रीज़ और इस तरह के संबंध में, कुछ पैटर्न हैं जो आप रीट्रीज़ के बीच देरी के साथ मूल पुन: प्रयास पैटर्न को आजमा सकते हैं। अगर रीट्री लगातार लगातार विफल हो जाती है तो मैं दृढ़ता से देरी का उपयोग करने पर विचार करता हूं। या आप सर्किट ब्रेकर पैटर्न को आजमा सकते हैं, यह थोड़ा और उन्नत है, और यह हो सकता है कि आप इस स्थिति में जो खोज रहे हैं। – Espen

0

पता लगा कि कैसे सत्र करने के लिए समय सीमा समाप्त, एक पुनः प्रयास के साथ सर्वर से सभी कॉल्स लपेटकर द्वारा:

function callServer(call) { 
    function err(r?: Error) { 
    var output = $.Deferred(); 
    if (r && 
     r.message && 
     (r.message.startsWith("Caller is not authorized to invoke the") || 
      r.message.startsWith("The user identity cannot change during "))) { 
     $('#login-dialog') 
      .one('hide.bs.modal', 
      () => { 
       hub.connection.stop(); 
       $.connection.hub.start() 
        .then(() => hub.server.run(call)) 
        .then(output.resolve, output.reject); 
       }) 
      .modal('show'); 
     return output; 
    } 
    // ReSharper disable once SuspiciousThisUsage 
    return output.rejectWith(this, <any>arguments); 
    } 

    return $.connection.hub.start() 
    .then(() => hub.server.run(call)) 
    .then(null, err); 
} 

इसका मतलब यह है कि वहाँ एक बूटस्ट्रैप मॉडल संवाद #login-dialog यह है कि जब आप बंद हो इसका मतलब यह संभाला है पुन लॉगिन।

संबंधित मुद्दे