web-dev-qa-db-fra.com

Comment SignalR fonctionne en interne?

Quelqu'un peut-il me dire comment SignalR fonctionne en interne de manière très évoluée?

J'imagine que cela efface les données en utilisant Response.Flush et côté client, il envoie des requêtes Ajax à certains intervalles. Est-ce correct?

154
user960567

Non, SignalR est une abstraction sur une connexion. Il vous donne deux modèles de programmation sur cette connexion (concentrateurs et connexions persistantes). SignalR a un concept de transport, chaque transport décide comment les données sont envoyées/reçues et comment il se connecte et se déconnecte.

SignalR a quelques transports intégrés:

  1. WebSockets
  2. Événements envoyés par le serveur
  3. Cadre pour toujours
  4. Long sondage

SignalR tente 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 haut niveau. Si vous voulez voir comment chaque transport est implémenté, vous pouvez regarder 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 vous demandez comment fonctionne le mode de scrutin long, notamment:

Il envoie une requête ajax au serveur qui attend de manière asynchrone la réponse du signal. Lorsqu'il y a un signal ou que la demande expire, le serveur renvoie le message et envoie une autre demande. Le processus se poursuit. (J'ai laissé quelques détails sur la façon dont le client garde une trace de ce qu'il a vu pour qu'il ne manque pas de messages)

J'espère que cela répond à la plupart de votre question.

233
davidfowl

@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, notamment entre WebSocket et d’autres transports; ci-dessous sont quelques points.

  • WebSocket est le seul transport qui établit une véritable connexion bidirectionnelle persistante entre le client et le serveur. Cependant, WebSocket n'est pris en charge que par IIS 8 ou supérieur, ainsi que les dernières versions d'Internet Explorer, Google Chrome et Mozilla Firefox.
  • Les événements Server Sent, Forever Frame et Long Polling suivent tous les trois une communication à sens unique et sont pris en charge par la plupart des navigateurs.
2
shivam