web-dev-qa-db-ja.com

IEでハンドソケットを閉じない場合、WebSocketが閉じない

私は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] 内で要求を実行できないことの原因である可能性もあります。

質問:

  1. ブラウザでJavaScriptを使用してエンドポイントに接続されているWebSocketの数をリセットする方法はありますか?
  2. 接続を完全に閉じずにWebSocketをエンドポイントからすぐに切断する方法はありますか?
  3. これを機能させて、エンドポイントをホストする人に変更を加えて終了フレームを送り返す人に通知する唯一の方法はありますか?
  4. 私が誤解したことや、これを機能させるために試すことができることはありますか?

ここに(私の意見では)誰かがそれについてもっと読みたいと思っているならWebSocketプロトコルについての良いドキュメントがあります [link1][link2]

更新:

IEでWebアプリケーションを更新することによってのみ、WebSocketは破棄されません
Webアプリケーションのページ間を移動すると、新しいWebSocketが作成されますが、最後のWebSocketは破棄されます。

38
OuuGiii

それがEdgeケースの問題である場合は、httpフォールバックを使用することが唯一のオプションである可能性があります。ソケット接続を遮断するプロキシサーバーについては、すでにこれを行っていると思います。

1
David Bradshaw

検証するアイデアは1つだけです(未確認)。残念ながら、IEにアクセスして確認することはできません。

アプリケーションがWebWorker/iFrameでWebSocket接続を開く可能性があります。ページの更新中に、「websocket接続スコープ」が削除され、接続が解放されます


説明

質問の本文からのこのコンテンツ:

IEでWebアプリケーションを更新することによってのみ、WebSocketは破棄されません。Webアプリケーションのページ間を移動すると、新しいWebSocketが作成されますが、最後のWebSocketは破棄されます。

Websocket接続が破棄されないと言う[〜#〜] only [〜#〜]ページが更新されたとき。通常のナビゲーション中は、すべて問題ありません。

したがって、ページのリロード中に削除される他のスコープ内でwebsocket接続が開かれている場合、うまくいけば接続は破棄されます。

0