Firefox 中意外的 Signalr 連接中止
我正在使用 SignalR(具有跨域請求),版本 2.3.0 用於集成到 ASP.NET 站點的網路聊天。一切正常。但我發現 SignalR 連接的奇怪行為。當我點擊聊天選項卡中的引用以下載文件時,SignalR 連接被中止,並且在我的 Hub 類中觸發了 onDisconnected 方法。FireBug 向我展示下一個 POST 請求:
http://*:81/signalr/abort?transport=longPolling&clientProtocol=1.4&token=eUpLNitKcmR1d2JhTTRvcHNVZmEwcG1EKzYvMElZbmg4aE5yam9xM3k0dz0_IjAsNGJmOWNhODUtNDU2NS00NWExLWFjMTgtNzgyN2FhZDA2Njg1LGxvY2FsaG9zdCI1&State=1&connectionToken=hDXe9xIZtmrapjl1LRwtK9B%2BfYMoeuHka8ctBLaPa0YnjiN9iiFa%2BvFMBHIGpGH0h8qPEDgGZSRGwjMw3Wm1DJi6cUPtZjLca6%2FR2576SGksLAj3lnPN1JWIlxMsn8%2Bf&connectionData=%5B%7B%22name%22%3A%22c%22%7D% 2C%7B%22name%22%3A%22voip%22%7D%5D,其中 * 是我的域。
它在 Mozilla Firefox(版本 30.0)中複製用於 LongPolling 或 Websocket 傳輸。我該如何解決這個問題?還是 SignalR 或 Firefox 的錯誤?
最近在 GitHub 上針對 SignalR 送出了此錯誤。基本思想是下載文件會導致 Firefox 觸發
window.onbeforeunload事件,進而導致 SignalR 關閉任何正在進行的連接。目前,解決方法是將處理程序附加到客戶端的斷開連接事件,該事件將
$.connection.start在一個 short 之後再次呼叫window.setTimeout。您還可以取消綁定 SignalR 的 onbeforeunload 處理程序:
$(window).unbind("beforeunload")。這樣做的缺點是,當使用者離開執行 SignalR 的頁面時,Firefox 可能無法正常斷開連接。如果沒有正常斷開連接,SignalR 將等待超過 30 秒,然後客戶端超時並呼叫orOnDisconnected上的處理程序。Hub``PersistentConnection