私はJavaScriptでWebSocketを実装してきましたが、次の1つの問題があります。
Webアプリケーションが接続されているエンドポイントが、クローズコントロールフレームを送信しているときに、それを送り返しません。
ブラウザはしばらくするとWebSocket接続を閉じるので、これはそれほど悪いことではありません。
ただし、注意すべき点がいくつかあります。
ブラウザーは、同時に接続できる特定の量のWebSocketのみを許可します。
Webアプリケーションを更新すると、新しいWebSocketが作成されます
これにより、IEで問題が発生します。
Webアプリケーションを6回以上更新すると、WebSocket接続を確立できません。
IEは、WebSocketが完全に閉じられていない場合、「削除」しないようです。奇妙なことに、Webソケットの量は、更新したり、単に待機したりしても減らないようです。 。
ブラウザウィンドウを閉じるか、タブを押すだけで、WebSocketの数が0にリセットされます。
私はいくつかの調査を行いましたが、これは私が見つけたものです:
ブラウザは、同時に接続される特定の量のWebSocketのみをサポートします。
IEは6つのWebソケットの接続をサポートしています [link]
Chromeは、接続する255のWebソケットをサポートします [link] 。
[socket.onclose()
]を実行してもsocket.close()
はトリガーされず、エンドポイントが終了メッセージで応答したときに呼び出されます。[link]
IEは、エンドポイントがクローズメッセージを送信するまで15秒待機します [link] 。
Chromeは応答メッセージを60秒間待ちます[申し訳ありませんが、これに対するリンクはありません。これはテストによって判明しました]。
応答メッセージが受信されない場合、ブラウザはWebSocket接続を閉じ、TimeoutErrorが発生します。
間違っている場合は修正してください:)
私はunbeforeload
を使用してエンドポイントから切断しようとしましたが、ブラウザーがしばらくして接続を閉じてもうまく行かないことを期待しています。 [リンク] 。
これは、IEがunbeforeload
関数 [link] 内で要求を実行できないことの原因である可能性もあります。
質問:
ここに(私の意見では)誰かがそれについてもっと読みたいと思っているならWebSocketプロトコルについての良いドキュメントがあります [link1][link2] 。
IEでWebアプリケーションを更新することによってのみ、WebSocketは破棄されません。
Webアプリケーションのページ間を移動すると、新しいWebSocketが作成されますが、最後のWebSocketは破棄されます。
それがEdgeケースの問題である場合は、httpフォールバックを使用することが唯一のオプションである可能性があります。ソケット接続を遮断するプロキシサーバーについては、すでにこれを行っていると思います。
検証するアイデアは1つだけです(未確認)。残念ながら、IEにアクセスして確認することはできません。
アプリケーションがWebWorker/iFrameでWebSocket接続を開く可能性があります。ページの更新中に、「websocket接続スコープ」が削除され、接続が解放されます
説明
質問の本文からのこのコンテンツ:
IEでWebアプリケーションを更新することによってのみ、WebSocketは破棄されません。Webアプリケーションのページ間を移動すると、新しいWebSocketが作成されますが、最後のWebSocketは破棄されます。
Websocket接続が破棄されないと言う[〜#〜] only [〜#〜]ページが更新されたとき。通常のナビゲーション中は、すべて問題ありません。
したがって、ページのリロード中に削除される他のスコープ内でwebsocket接続が開かれている場合、うまくいけば接続は破棄されます。