Alguém pode me informar como o SignalR funciona internamente de maneira de alto nível?
Acho que está liberando os dados usando Response.Flushe, no lado do cliente, está enviando solicitações do Ajax em determinados intervalos. Está correto?
Veja também esta apresentação na NDC 2013 de David Fowler e Damian Edwards chamada 'Under the cover with ASP.NET SignalR', onde eles constroem uma versão lite do SignalR ao vivo no palco. É muito informativo. É pré 2.0, mas isso não deve importar muito. vimeo.com/68383353
Johan B
Respostas:
241
Não, SignalR é uma abstração através de uma conexão. Ele fornece dois modelos de programação nessa conexão (hubs e conexões persistentes). O SignalR tem um conceito de transporte, cada transporte decide como os dados são enviados / recebidos e como eles se conectam e desconectam.
O SignalR possui alguns transportes integrados:
WebSockets
Eventos Enviados pelo Servidor
Forever Frame
Votação longa
O SignalR tenta escolher a "melhor" conexão suportada pelo servidor e pelo cliente (você também pode forçá-lo a usar um transporte específico).
Esse é o nível alto. Se você quiser ver como cada transporte é implementado, consulte o código-fonte .
Se você está perguntando sobre como o transporte de pesquisas longas funciona em particular:
Ele envia uma solicitação ajax para o servidor que está esperando assincronamente por um sinal para responder. Quando um sinal ou a solicitação atinge o tempo limite, ela retorna do servidor e envia outra solicitação e o processo continua. (Deixei alguns detalhes sobre como o cliente registra o que viu para não perder mensagens)
Espero que isso responda a maior parte de sua pergunta.
você pode me dizer quantas conexões ele suporta de uma só vez?
Farhad-Taran
1
O número de conexões suportadas pelo Signalr depende do limite de solicitações do IIS. Pode ser aumentado usando entradas de configuração ou scripts de shell. Normalmente, o Signalr armazena em cache 1000 conexões na memória.
Thanigainathan
1
Como já mencionado, o rally de limite está no nível do servidor. Damnien Edwards (co-criador do SignalR) tem 150.000 conexões de um único servidor de 10 GB: twitter.com/DamianEdwards/status/486642486350061568
@davidfowl já respondeu à maior parte. No entanto, para fornecer mais alguns detalhes sobre a diferença no comportamento dos transportes, especificamente entre o WebSocket e outros transportes; abaixo estão alguns pontos.
O WebSocket é o único transporte que estabelece uma conexão bidirecional verdadeira e persistente entre cliente e servidor. No entanto, o WebSocket é suportado apenas pelo IIS 8 ou superior e pelas versões mais recentes do Internet Explorer, Google Chrome e Mozilla Firefox.
Enquanto os eventos enviados pelo servidor, o Forever Frame e a pesquisa longa, os três seguem uma comunicação unidirecional e são suportados pela maioria dos navegadores.
Respostas:
Não, SignalR é uma abstração através de uma conexão. Ele fornece dois modelos de programação nessa conexão (hubs e conexões persistentes). O SignalR tem um conceito de transporte, cada transporte decide como os dados são enviados / recebidos e como eles se conectam e desconectam.
O SignalR possui alguns transportes integrados:
O SignalR tenta escolher a "melhor" conexão suportada pelo servidor e pelo cliente (você também pode forçá-lo a usar um transporte específico).
Esse é o nível alto. Se você quiser ver como cada transporte é implementado, consulte o código-fonte .
Também há código de cliente para cada transporte: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS
Se você está perguntando sobre como o transporte de pesquisas longas funciona em particular:
Ele envia uma solicitação ajax para o servidor que está esperando assincronamente por um sinal para responder. Quando um sinal ou a solicitação atinge o tempo limite, ela retorna do servidor e envia outra solicitação e o processo continua. (Deixei alguns detalhes sobre como o cliente registra o que viu para não perder mensagens)
Espero que isso responda a maior parte de sua pergunta.
fonte
@davidfowl já respondeu à maior parte. No entanto, para fornecer mais alguns detalhes sobre a diferença no comportamento dos transportes, especificamente entre o WebSocket e outros transportes; abaixo estão alguns pontos.
fonte