ในที่สุดฉันก็คิดออก นี่คือสิ่งที่ฉันได้เรียนรู้ตั้งแต่เริ่มคำถามนี้:
ความเป็นมา:เรากำลังสร้างแอป iOS โดยใช้ Xamarin / Monotouch และไคลเอนต์. NET SignalR 2.0.3 เรากำลังใช้โปรโตคอล SignalR เริ่มต้น - และดูเหมือนว่าจะใช้ SSE แทนเว็บซ็อกเก็ต ฉันยังไม่แน่ใจว่าจะใช้เว็บซ็อกเก็ตกับ Xamarin / Monotouch ได้หรือไม่ ทุกอย่างโฮสต์โดยใช้เว็บไซต์ Azure
เราต้องการแอปเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ SignalR ของเราใหม่อย่างรวดเร็ว แต่เรายังคงประสบปัญหาที่การเชื่อมต่อไม่ได้เชื่อมต่อใหม่ด้วยตัวเองหรือการเชื่อมต่อใหม่ใช้เวลา 30 วินาที (เนื่องจากโปรโตคอลหมดเวลา)
มีสามสถานการณ์ที่เราทดสอบสำหรับ:
สถานการณ์ A - เชื่อมต่อในครั้งแรกที่โหลดแอป สิ่งนี้ทำงานได้อย่างไม่มีที่ติตั้งแต่วันแรก การเชื่อมต่อจะเสร็จสิ้นภายในเวลาน้อยกว่า. 25 วินาทีแม้ผ่านการเชื่อมต่อมือถือ 3G (สมมติว่าเปิดวิทยุแล้ว)
สถานการณ์ B - เชื่อมต่อกับเซิร์ฟเวอร์ SignalR อีกครั้งหลังจากที่แอปไม่ได้ใช้งาน / ปิดเป็นเวลา 30 วินาที ในสถานการณ์นี้ไคลเอนต์ SignalR จะเชื่อมต่อกับเซิร์ฟเวอร์ใหม่ในที่สุดโดยไม่ต้องทำงานพิเศษใด ๆ - แต่ดูเหมือนว่าจะรอ 30 วินาทีก่อนที่จะพยายามเชื่อมต่อใหม่ (ช้าเกินไปสำหรับแอปของเรา)
ในช่วงเวลารอ 30 วินาทีนี้เราได้ลองโทรไปที่ HubConnection.Start () ซึ่งไม่มีผลใด ๆ และการเรียก HubConnection.Stop () ยังใช้เวลา 30 วินาที ฉันพบข้อบกพร่องที่เกี่ยวข้องในไซต์ SignalR ซึ่งดูเหมือนจะได้รับการแก้ไขแต่เรายังคงมีปัญหาเดียวกันใน v2.0.3
สถานการณ์ C - เชื่อมต่อกับเซิร์ฟเวอร์ SignalR อีกครั้งหลังจากที่แอปไม่ได้ใช้งาน / ปิดเป็นเวลา 120 วินาทีหรือนานกว่านั้น ในสถานการณ์นี้โปรโตคอลการขนส่ง SignalR หมดเวลาแล้วดังนั้นไคลเอนต์จะไม่เชื่อมต่อใหม่โดยอัตโนมัติ สิ่งนี้อธิบายว่าเหตุใดบางครั้งไคลเอ็นต์จึงเชื่อมต่อใหม่ด้วยตัวเอง แต่ไม่เคยเชื่อมต่อ ข่าวดีก็คือการเรียก HubConnection.Start () ทำงานได้เกือบจะทันทีเหมือนสถานการณ์ A
ดังนั้นฉันจึงต้องใช้เวลาสักพักกว่าจะรู้ว่าเงื่อนไขการเชื่อมต่อใหม่นั้นแตกต่างกันไปขึ้นอยู่กับว่าแอปปิดเป็นเวลา 30 วินาทีเทียบกับ 120+ วินาทีหรือไม่ และแม้ว่าบันทึกการติดตาม SignalR จะให้แสงสว่างว่าเกิดอะไรขึ้นกับโปรโตคอลพื้นฐาน แต่ฉันไม่เชื่อว่าจะมีวิธีจัดการกับเหตุการณ์ระดับการขนส่งในรหัสได้ (เหตุการณ์ Closed () เริ่มทำงานหลังจาก 30 วินาทีในสถานการณ์ B ทันทีในสถานการณ์ C คุณสมบัติของรัฐระบุว่า "เชื่อมต่อแล้ว" ในระหว่างช่วงเวลารอการเชื่อมต่อใหม่เหล่านี้ไม่มีเหตุการณ์หรือวิธีการอื่น ๆ ที่เกี่ยวข้อง)
วิธีแก้ไข:
วิธีแก้ปัญหานั้นชัดเจน เราไม่ได้รอให้ SignalR ทำการเชื่อมต่อเวทย์มนตร์ใหม่ แต่เมื่อเปิดใช้งานแอปหรือเมื่อคืนค่าการเชื่อมต่อเครือข่ายของโทรศัพท์เราก็เพียงแค่ทำความสะอาดเหตุการณ์และยกเลิกการอ้างอิง HubConnection (ไม่สามารถกำจัดได้เนื่องจากใช้เวลา 30 วินาทีหวังว่าการรวบรวมขยะจะดูแลได้ ) และสร้างอินสแตนซ์ใหม่ ตอนนี้ทุกอย่างทำงานได้ดี ด้วยเหตุผลบางประการฉันคิดว่าเราควรใช้การเชื่อมต่อที่มีอยู่ซ้ำและเชื่อมต่อใหม่แทนที่จะสร้างอินสแตนซ์ใหม่