Alguém pode me informar como o SignalR funciona internamente de maneira de alto nível?
Acho que está liberando os dados usando Response.Flush
e, no lado do cliente, está enviando solicitações do Ajax em determinados intervalos. Está correto?
Alguém pode me informar como o SignalR funciona internamente de maneira de alto nível?
Acho que está liberando os dados usando Response.Flush
e, no lado do cliente, está enviando solicitações do Ajax em determinados intervalos. Está correto?
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.
@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.