2015-08-18 50 views
4

我在新的Window Edge瀏覽器上對Websocket進行了測試。邊緣瀏覽器Websocket連接將在空閒時間後自動關閉

似乎Edge瀏覽器上的websocket連接將在空閒時間(沒有數據傳輸b/w 2個端點)後自動關閉。 這個問題不會發生在Chrome或Firefox上。

我只是想知道: 當在Edge瀏覽器上初始化websocket連接以保持連接打開時是否還有其他配置?

我真的不'想要實現心跳機制,因爲實際上其他瀏覽器上的一切仍然正常。

回答

2

這可能不是你想要的答案,但...

對於WebSocket的大多數生產環境的應用程序背後的WebSocket代理(Apache時,Nginx的等「),通常還充當負載平衡器運行。

這些服務器還將實現避免half closed套接字所需的「超時」機制(當只有一側關閉連接並且沒有數據傳輸,不會產生錯誤並且文件句柄可以無限期地保持打開狀態)。例如,Heroku enforces a 55 second timeout window

這意味着無論如何,您應該設置心跳 - 即使您的開發應用沒有關閉。

如果您正在編寫服務器端應用程序並控制websocket,則應該設置ping框架,以避免引發onmessage事件(ping和pong框架有不同的op code和aren是常規消息序列的一部分)。

一些websocket框架(比如Ruby上的Plezi)會自動設置ping作爲默認選項,但是有些服務器/框架會讓你感覺不到。

總結:

這些斷開將是一個生產環境預期的行爲(甚至是必需的行爲)。雖然它也很可能成爲MS Edge問題,但您可能必須在兩種情況下實施心跳。

P.S.

WebSocket的標準規定:每當期望

服務器可能關閉WebSocket連接。客戶端不應該任意關閉WebSocket連接。

服務器(和Websocket代理和負載平衡器)使用它來建立它們的超時。 客戶有責任重新連接

MS邊緣真的不應該使用超時,因爲這不是根據標準的預期行爲...儘管Edge可能會這樣做以確保連接仍然處於打開狀態(通過強制腳本重新連接,作爲對服務器任意斷開的反應)。

+0

謝謝!但如果這是服務器配置的問題。爲什麼它仍然可以在Chrome或Firefox等其他瀏覽器上運行。你有沒有想過這是MS Edge的錯誤? –

+0

我沒有說** ** ** **服務器**問題** - 我說** ** **是**生產環境的預期行爲**(即使是_required_行爲)。它也**非常可能成爲MS Edge問題,但在這兩種情況下您都必須實施心跳。 – Myst

+0

@ChiếnNghê我更新了我的答案,以反映我的評論(我對您的評論的回答),並指出放棄連接(通常由於超時)是您應該在生產環境中準備的預期服務器行爲。 – Myst