web-dev-qa-db-fra.com

WebSockets ne se fermant pas IE si la fermeture de la poignée de main n'est jamais effectuée

J'ai implémenté un WebSocket avec JavaScript et j'ai ce seul problème:
Le point de terminaison auquel mon application Web est connectée ne renvoie pas de cadre de contrôle de fermeture lorsque j'en envoie un.

Ce n'est pas si mal car les navigateurs ferment la connexion WebSocket après un certain temps.

Mais quelques points à noter sont:

  • Les navigateurs ne permettent de connecter qu'une quantité spécifique de WebSockets en même temps.

  • Lors de l'actualisation de l'application Web, un nouveau WebSocket est créé

Cela provoque le problème sur IE:
Lors de l'actualisation de l'application Web plus de 6 fois, une connexion WebSocket ne peut pas être établie.

Il semble que IE ne "supprime" pas les WebSockets s'ils n'ont pas été fermés proprement. Et ce qui est étrange, c'est que la quantité de sockets Web ne semble jamais diminuer en rafraîchissant ou simplement en attendant .

Uniquement en fermant la fenêtre du navigateur, ou l'onglet réinitialise le nombre de WebSockets à 0.


J'ai fait quelques recherches et voici ce que j'ai découvert:


Les navigateurs ne prennent en charge qu'une quantité spécifique de WebSockets à connecter en même temps.

IE prend en charge 6 websockets pour se connecter [link]

Chrome prend en charge 255 websockets pour se connecter [link] .

Et socket.onclose() n'est pas déclenché lorsque vous effectuez socket.close(), il est appelé lorsque le noeud final répond avec un message de fermeture. [lien]

IE attend 15 secondes pour que le point de terminaison envoie le message de fermeture [lien] .

Chrome attend 60s pour le message de réponse [Désolé, aucun lien pour cela, a découvert cela en testant].

Si aucun message de réponse n'est reçu, le navigateur ferme la connexion WebSocket et une erreur TimeoutError doit se produire.

Veuillez me corriger si je me trompe:)


J'ai essayé d'utiliser unbeforeload pour se déconnecter du point de terminaison dans l'espoir que le navigateur ferme la connexion après un certain temps, mais sans succès. [lien] .
Cela peut également être la cause de cela IE ne peut pas faire de requête à l'intérieur de la fonction unbeforeload[lien] .

Question:

  1. Existe-t-il un moyen de réinitialiser le nombre de WebSockets connectés dans le navigateur au point de terminaison avec JavaScript?
  2. Existe-t-il un moyen de déconnecter immédiatement un WebSocket du point de terminaison sans fermer proprement la connexion?
  3. Est-ce la seule façon de faire fonctionner cela pour informer ceux qui hébergent leur point de terminaison d'apporter des modifications afin qu'ils renvoient un cadre de fermeture?
  4. Y a-t-il quelque chose que j'ai mal compris ou que je pourrais essayer de faire fonctionner?

Voici (à mon avis) une bonne documentation sur les protocoles WebSocket si quelqu'un souhaite en savoir plus [link1][link2] .

METTRE À JOUR:

Uniquement en actualisant l'application Web sur IE les WebSockets ne sont pas détruits .
Si vous naviguez entre les pages de l'application Web, un nouveau WebSocket sera créé mais le dernier WebSocket sera détruit.

38
OuuGiii

S'il s'agit simplement d'un problème de cas Edge, l'utilisation d'une solution de secours http peut être votre seule option. Je suppose que vous le faites déjà pour les serveurs proxy qui bloquent la connexion par socket.

1
David Bradshaw

Il n'y a qu'une seule idée à vérifier (non confirmé). Malheureusement, vous n'avez pas accès à IE pour vérifier.

L'application peut ouvrir une connexion Websocket dans WebWorker/iFrame. Pendant l'actualisation de la page, la "portée de la connexion websocket" sera supprimée et la connexion est libérée


EXPLICATION

Ce contenu du corps de la question:

Ce n'est qu'en actualisant l'application Web sur IE que les WebSockets ne sont pas détruits. Si vous naviguez entre les pages de l'application Web, un nouveau WebSocket sera créé mais le dernier WebSocket sera détruit.

Dit que la connexion Websocket n'est pas détruite UNIQUEMENT lors de l'actualisation de la page. Pendant la navigation normale, tout est OK.

Donc, si la connexion Websocket est ouverte dans une autre étendue qui sera supprimée lors du rechargement de la page, alors, espérons-le, la connexion sera détruite.

0
Andrii Muzalevskyi