मैं अंत में यह पता लगा। इस प्रश्न को शुरू करने के बाद से मैंने क्या सीखा है:
पृष्ठभूमि: हम Xamarin / Monotouch और .NET सिग्नलआर 2.0.3 क्लाइंट का उपयोग करके एक iOS ऐप बना रहे हैं। हम डिफ़ॉल्ट सिग्नलआर प्रोटोकॉल का उपयोग कर रहे हैं - और यह वेब सॉकेट के बजाय SSE का उपयोग करता प्रतीत होता है। मुझे अभी तक यकीन नहीं है कि Xamarin / Monotouch के साथ वेब सॉकेट का उपयोग करना संभव है। एज़्योर वेबसाइटों का उपयोग करके सब कुछ होस्ट किया जाता है।
हमें अपने सिग्नलआर सर्वर को जल्दी से फिर से कनेक्ट करने के लिए ऐप की आवश्यकता थी, लेकिन हमें ऐसी समस्याएं आ रही थीं, जहां कनेक्शन अपने आप ही पुन: कनेक्ट नहीं हुआ - या फिर से कनेक्ट होने में लगभग 30 सेकंड लगे (एक अंतर्निहित प्रोटोकॉल टाइमआउट के कारण)।
हमारे लिए परीक्षण समाप्त होने के तीन परिदृश्य थे:
परिदृश्य ए - पहली बार ऐप लोड होने पर कनेक्ट करना।यह पहले दिन से निर्दोष रूप से काम किया। 3 जी मोबाइल कनेक्शन पर भी यह कनेक्शन कम से कम .25 सेकंड में पूरा होता है। (यह मानते हुए कि रेडियो पहले से ही चालू है)
परिदृश्य बी - 30 सेकंड के लिए एप्लिकेशन निष्क्रिय / बंद होने के बाद सिग्नलआर सर्वर को फिर से कनेक्ट करना। इस परिदृश्य में, सिग्नलआर क्लाइंट अंततः बिना किसी विशेष कार्य के सर्वर पर अपने आप को फिर से कनेक्ट करेगा - लेकिन फिर से कनेक्ट करने के प्रयास से ठीक 30 सेकंड पहले प्रतीक्षा करना प्रतीत होता है। (हमारे ऐप के लिए बहुत धीमी गति से)
इस 30 सेकंड के वेटिंग पीरियड के दौरान हमने HubConnection.Start () कॉल करने की कोशिश की जिसका कोई असर नहीं हुआ। और HubConnection.Stop () को कॉल करने में भी 30 सेकंड लगते हैं। मुझे सिग्नलआर साइट पर एक संबंधित बग मिला जो हल किया गया प्रतीत होता है , लेकिन हमें अभी भी v2.0.3 में यही समस्या है।
परिदृश्य सी - 120 सेकंड या उससे अधिक समय तक ऐप के निष्क्रिय / बंद होने के बाद सिग्नलआर सर्वर से फिर से कनेक्ट करना। इस परिदृश्य में, सिग्नलआर ट्रांसपोर्ट प्रोटोकॉल पहले ही समाप्त हो चुका है, इसलिए क्लाइंट कभी भी स्वचालित रूप से पुन: कनेक्ट नहीं होता है। यह बताता है कि ग्राहक कभी-कभी क्यों होता था लेकिन हमेशा अपने आप को फिर से कनेक्ट नहीं कर रहा था। अच्छी खबर यह है कि हबकॉन्नेशन को कॉल करना। स्टार्ट () परिदृश्य ए की तरह लगभग तुरंत काम करता है।
इसलिए मुझे यह महसूस करने में थोड़ी देर लगी कि ऐप को 30 सेकंड बनाम 120+ सेकंड के लिए बंद करने के आधार पर पुन: कनेक्ट होने की स्थिति अलग-अलग थी। और हालांकि सिग्नलआर ट्रेसिंग लॉग्स रोशन करता है कि अंतर्निहित प्रोटोकॉल के साथ क्या हो रहा है, मुझे विश्वास नहीं है कि कोड में परिवहन स्तर की घटनाओं को संभालने का एक तरीका है। परिदृश्य बी में 30 सेकंड के बाद (बंद) घटना आग लग जाती है, तुरंत परिदृश्य सी में; राज्य संपत्ति का कहना है कि "कनेक्टेड" इन पुनरावर्ती प्रतीक्षा अवधि के दौरान; कोई अन्य प्रासंगिक घटना या विधियाँ नहीं;
समाधान:
समाधान स्पष्ट है। हम इसके पुन: संयोजन जादू करने के लिए सिग्नलआर का इंतजार नहीं कर रहे हैं। इसके बजाय, जब ऐप सक्रिय होता है या जब फोन का नेटवर्क कनेक्शन बहाल हो जाता है, तो हम बस ईवेंट को साफ कर रहे हैं और हबकॉन्क्शन को डी-रेफर कर रहे हैं (इसे डिस्पोज नहीं कर सकते क्योंकि इसमें 30 सेकंड का समय लगता है, उम्मीद है कि कचरा संग्रह इसकी देखभाल करेगा ) और एक नया उदाहरण बना। अब सब कुछ बढ़िया काम कर रहा है। किसी कारण के लिए, मुझे लगा कि हमें एक नए कनेक्शन का उपयोग करने के बजाय एक निरंतर कनेक्शन का पुन: उपयोग करना चाहिए और फिर से कनेक्ट करना चाहिए।