2009-09-07 11 views
3

J'ai une page qui fait déjà plusieurs demandes AJAX en même temps. Ils utilisent le modèle Comet, donc il y a toujours plusieurs connexions HTTP ouvertes, attendant plus de données du serveur. À mesure que la page deviendra plus complexe à l'avenir, il y en aura peut-être même plus. Je suis préoccupé par l'ouverture de trop de connexions.Est-il possible de "multiplexer" plusieurs requêtes AJAX à partir d'une même page?

Je me demande s'il existe un moyen de les "multiplexer", c'est-à-dire. avoir une seule connexion à travers laquelle toutes les demandes sont envoyées et acheminer les messages vers les fonctions de gestionnaire appropriées à la fois sur le serveur et les côtés du client. Jusqu'à présent, je n'arrive pas à trouver un moyen de le faire, car une fois que je fais une requête HTTP et qu'il commence à attendre des données, je ne pense pas qu'il soit possible d'envoyer plus de données de requête. Je pourrais fermer cette connexion avant d'en ouvrir une autre pour envoyer plus de données, mais que se passe-t-il si le serveur envoie une réponse juste après? Est-ce que j'essaie de faire quelque chose que je ne devrais pas?

Répondre

1

Pourquoi pensez-vous qu'il est impossible d'avoir plus d'une connexion ouverte? As-tu essayé? Une approche que nous avons utilisée consistait à utiliser théoriquement deux connexions: une pour Comet, toutes les livraisons asynchrones étant multiplexées, tant de types de messages différents y arrivaient. Demande/réponse est arrivé de l'autre En effet, nous venons d'écrire une application Ajax classique, avec Comet en extra.

+0

Il est possible d'avoir plus d'une connexion et c'est ce que j'ai déjà. Je suis juste préoccupé par les limitations du navigateur si j'ouvre, par exemple, 10 connexions - et l'utilisateur a plusieurs instances de ma page ouverte. Mais le multiplexage seulement des réponses est une idée intéressante, puisque les connexions de demande peuvent être de très courte durée. Hmm ... – EMP

0

Il existe un accord entre les développeurs de navigateurs - que seulement 2 demandes simultanées peuvent être envoyées au même sous-domaine. C'est pourquoi plusieurs requêtes AJAX sont utiles, mais gardez la file d'attente à l'esprit. D'autre part, l'invocation JScript est restreinte par raison de sécurité à un seul sous-domaine. Il est petit truc pour sauter par-dessus cette restriction (voir par exemple http://www.simple-talk.com/dotnet/asp.net/calling-cross-domain-web-services-in-ajax/ section « Script dynamique Tag hack »)

+0

Je ne suis pas sûr que la limite de 2 connexions soit vraie. Il est maintenant 6 pour IE8 http://msdn.microsoft.com/en-us/library/cc304129(VS.85).aspx (et il a toujours été possible de changer cela avec un paramètres de registre pour les versions antérieures d'IE.) Je ne pense pas que Chrome se limite à 2 non plus. Je ne suis pas sûr de Firefox, Safari ou Opera. –

+0

@Dave Webb - c'est plutôt bizarre si vous demandez à vos clients Web de modifier les paramètres avant le démarrage de la page AJAX. C'est pourquoi j'ai parlé de garder un accord en tête. "Soyez prêt pour le pire" – Dewfy

0

Je fini par faire ce que djna décrit (au moins je pense c'est la même chose): avoir un La connexion de type Comet est toujours ouverte et continue d'écouter les réponses, mais envoie les requêtes AJAX en utilisant de nouvelles connexions, comme d'habitude. Chaque requête retourne immédiatement avec un "ID de travail" (la connexion est donc de courte durée) et toutes les autres données pour ce "travail" sont envoyées par la connexion Comet. De cette façon, il y a au maximum 2 connexions à tout moment, sauf si 2 requêtes AJAX se produisent en même temps, ce qui est peu probable dans mon cas.

Bien sûr, il peut y avoir plusieurs clients utilisant la page en même temps, donc pour savoir quelles réponses de travail doivent être envoyées sur la connexion de la comète, j'ai aussi un "ID de session comète". Cet ID est généré lorsque la page se charge et ne change pas pendant la durée de vie de la page. Après la requête AJAX normale qui crée un travail, j'envoie une autre requête AJAX très simple avec l'ID de travail et l'ID de session. Cela associe ce travail à la session et indique au serveur d'envoyer toutes les réponses pour ce travail à la connexion alread-établie associée à cet ID de session.

J'aurais pu faire l'ID de session une partie de la demande initiale, bien sûr, mais cela signifierait que chaque méthode AJAX du côté serveur aurait besoin de savoir à ce sujet et je préfère le garder séparé, comme partie de l'infrastructure.

Questions connexes