Quelqu'un peut-il me dire comment SignalR fonctionne en interne de manière de haut niveau?
Je suppose qu'il vide les données en utilisant Response.Flush
et du côté client, il envoie des requêtes Ajax à certains intervalles. Est-ce correct?
Quelqu'un peut-il me dire comment SignalR fonctionne en interne de manière de haut niveau?
Je suppose qu'il vide les données en utilisant Response.Flush
et du côté client, il envoie des requêtes Ajax à certains intervalles. Est-ce correct?
Réponses:
Non, SignalR est une abstraction sur une connexion. Il vous donne deux modèles de programmation sur cette connexion (hubs et connexions persistantes). SignalR a un concept de transports, chaque transport décide comment les données sont envoyées / reçues et comment elles se connectent et se déconnectent.
SignalR a quelques transports intégrés:
SignalR essaie de choisir la "meilleure" connexion prise en charge par le serveur et le client (vous pouvez également le forcer à utiliser un transport spécifique).
C'est le niveau élevé. Si vous souhaitez voir comment chaque transport est implémenté, vous pouvez consulter le code source .
Il existe également un code client pour chaque transport: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS
Si vous demandez comment fonctionne le long transport d'interrogation en particulier:
Il envoie une requête ajax au serveur qui attend de manière asynchrone qu'un signal réponde. Lorsqu'il y a un signal ou que la demande expire, elle revient du serveur et envoie une autre demande et le processus se poursuit. (J'ai laissé quelques détails sur la façon dont le client suit ce qu'il a vu pour ne pas manquer de messages)
J'espère que cela répond à la plupart de votre question.
@davidfowl a déjà répondu à la majeure partie. Cependant, pour fournir quelques détails supplémentaires concernant la différence de comportement des transports, en particulier entre WebSocket et d'autres transports; Voici quelques points.