Cuối cùng tôi đã tìm ra điều này. Đây là những gì tôi đã học được kể từ khi bắt đầu câu hỏi này:
Thông tin cơ bản: Chúng tôi đang xây dựng một ứng dụng iOS bằng Xamarin / Monotouch và ứng dụng khách .NET SignalR 2.0.3. Chúng tôi đang sử dụng các giao thức SignalR mặc định - và có vẻ như nó đang sử dụng SSE thay vì các ổ cắm web. Tôi không chắc liệu có thể sử dụng các ổ cắm web với Xamarin / Monotouch hay không. Mọi thứ được lưu trữ bằng các trang web Azure.
Chúng tôi cần ứng dụng nhanh chóng kết nối lại với máy chủ SignalR của mình, nhưng chúng tôi vẫn gặp sự cố trong đó kết nối không tự kết nối lại - hoặc quá trình kết nối lại mất đúng 30 giây (do giao thức cơ bản hết thời gian chờ).
Có ba tình huống mà chúng tôi đã kết thúc thử nghiệm:
Tình huống A - kết nối lần đầu tiên ứng dụng được tải. Điều này hoạt động hoàn hảo ngay từ ngày đầu tiên. Kết nối hoàn tất trong vòng chưa đầy 0,25 giây ngay cả trên kết nối di động 3G. (giả sử đài đã được bật)
Tình huống B - kết nối lại với máy chủ SignalR sau khi ứng dụng không hoạt động / đóng trong 30 giây. Trong trường hợp này, máy khách SignalR cuối cùng sẽ tự kết nối lại với máy chủ mà không cần thực hiện bất kỳ thao tác đặc biệt nào - nhưng dường như phải đợi chính xác 30 giây trước khi cố gắng kết nối lại. (quá chậm đối với ứng dụng của chúng tôi)
Trong khoảng thời gian chờ 30 giây này, chúng tôi đã thử gọi HubConnection.Start () mà không có tác dụng. Và việc gọi HubConnection.Stop () cũng mất 30 giây. Tôi đã tìm thấy một lỗi liên quan trên trang SignalR dường như đã được giải quyết , nhưng chúng tôi vẫn gặp sự cố tương tự trong v2.0.3.
Tình huống C - kết nối lại với máy chủ SignalR sau khi ứng dụng không hoạt động / đóng trong 120 giây hoặc lâu hơn. Trong trường hợp này, giao thức truyền tải SignalR đã hết thời gian chờ nên máy khách không bao giờ tự động kết nối lại. Điều này giải thích tại sao khách hàng đôi khi nhưng không phải lúc nào cũng tự kết nối lại. Tin tốt là việc gọi HubConnection.Start () hoạt động gần như ngay lập tức giống như kịch bản A.
Vì vậy, tôi đã mất một lúc để nhận ra rằng các điều kiện kết nối lại khác nhau dựa trên việc ứng dụng được đóng trong 30 giây so với 120 giây trở lên. Và mặc dù nhật ký theo dõi SignalR chiếu sáng những gì đang xảy ra với giao thức cơ bản, tôi không tin rằng có cách xử lý các sự kiện cấp độ truyền tải trong mã. (sự kiện Closed () kích hoạt sau 30 giây trong kịch bản B, ngay lập tức trong kịch bản C; thuộc tính Trạng thái cho biết "Đã kết nối" trong các khoảng thời gian chờ kết nối lại này; không có sự kiện hoặc phương thức liên quan nào khác)
Giải pháp: Giải
pháp là hiển nhiên. Chúng tôi không chờ SignalR thực hiện phép thuật kết nối lại. Thay vào đó, khi ứng dụng được kích hoạt hoặc khi kết nối mạng của điện thoại được khôi phục, chúng tôi chỉ cần dọn dẹp các sự kiện và hủy tham chiếu HubConnection (không thể loại bỏ nó vì nó mất 30 giây, hy vọng việc thu gom rác sẽ xử lý được nó ) và tạo một phiên bản mới. Bây giờ mọi thứ đang hoạt động tuyệt vời. Vì lý do nào đó, tôi nghĩ chúng ta nên sử dụng lại một kết nối lâu dài và kết nối lại thay vì chỉ tạo một phiên bản mới.