Comment SignalR fonctionne en interne?

160

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.Flushet du côté client, il envoie des requêtes Ajax à certains intervalles. Est-ce correct?

user960567
la source
13
@dfowler a récemment fait une interview avec Scott Hansleman qui était très informative hanselminutes.com/291/… .
Aligné le
1
Bon article sur l'architecture signal r et son fonctionnement lostechies.com/erichexter/2012/11/05/… asp.net/signalr/overview/getting-started
Mahesh
Je sais que c'est il y a longtemps, mais microsoftvirtualacademy.com/Content
...
1
Voir également cette présentation au NDC 2013 de David Fowler et Damian Edwards intitulée `` Sous les couvertures avec ASP.NET SignalR '' où ils construisent une version allégée de SignalR en direct sur scène. C'est très instructif. C'est pré 2.0 mais cela ne devrait pas avoir beaucoup d'importance. vimeo.com/68383353
Johan B

Réponses:

241

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:

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

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
la source
3
pouvez-vous me dire combien de connexions il peut prendre en charge en même temps?
Farhad-Taran
1
Le nombre de connexions que Signalr va prendre en charge dépend de la limite de demande de l'IIS. Il peut être augmenté à l'aide d'entrées de configuration ou de scripts shell. Généralement, Signalr met en cache 1000 connexions en mémoire.
Thanigainathan
1
Comme déjà mentionné, le rallye limite se situe au niveau du serveur. Damnien Edwards (co-créateur de SignalR) a obtenu 150000 connexions à partir d'un seul serveur de 10 Go: twitter.com/DamianEdwards/status/486642486350061568
LDJ
toute réponse à cette question stackoverflow.com/q/40906789/3565879
Technacron
@davidfowl s'il vous plaît donner une réponse pour ce stackoverflow.com/questions/47504489/…
Hitesh Thakor
5

@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.

  • 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, et les dernières versions d'Internet Explorer, Google Chrome et Mozilla Firefox.
  • Alors que les événements envoyés par le serveur, Forever Frame et Long polling, les trois suivent une communication unidirectionnelle et sont pris en charge par la plupart des navigateurs.
shivam
la source