O ASP.NET SignalR é uma biblioteca open-source que facilita a implementação de comunicação em tempo real, atualizações/notificações de forma assíncrona em uma aplicação.
Foi desenvolvido por dois funcionários da Microsoft – Damian Edwards e David Fowler, todo o código fonte do projeto está disponível no GitHub
Há um certo tempo foi incorporado pela plataforma ASP.Net, sendo:
Funciona através de uma biblioteca Server Side (ASP.Net) e uma Client Side (Javascript), é suportado em aplicações do tipo Silverlight, Windows Phone 7 e 8 e WinRT. Veja a lista completa de plataformas suportadas aqui.
Quem já precisou desenvolver uma aplicação real-time conhece as dificuldades de manter um certo volume de conexões do servidor, manipular a maneira que o servidor trata as requisições, garantir que o client esteja exibindo as informações no tempo certo e enfim.
Existem alguns meios de implementar uma comunicação em tempo real (Long Polling, WebSockets, Node.js) todas essas técnicas/tecnologias possuem sua complexidade ou limitação técnica, o SignalR propõe a facilitar a implementação da comunicação real-time em sua aplicação.
O que é uma aplicação real-time?
É uma aplicação onde a informação chega em tempo real, imagine um chat ou um ticker de cotação da bolsa de valores, essas informações estão sendo distribuídas em tempo real para todos os clientes consumidores da aplicação.
Para se desenvolver uma aplicação em tempo real é necessário que o servidor seja capaz de sensibilizar todos os clientes conectados assim que uma informação chegar.
Como funciona?
O ASP.Net SignalR é uma abstração de uma conexão, ele trabalha por baixo dos panos definindo o melhor tipo de transporte em dois níveis diferentes de abstração o que ocasiona uma impressão de uma conexão persistente.
Transportes
Um dos grandes pontos do ASP.Net SignalR é sua capacidade de gerenciar a escolha do tipo de transporte a ser utilizado.
Como mostra a figura existem quatro tipos de transportes disponíveis:
- WebSockets
- Long Polling
- Server Sent Events
- Forever Frame
Lendo a documentação do ASP.Net SignalR iremos entender que fica a cargo dele encontrar o transporte mais eficaz entre um server/client, dando sempre preferência por WebSockets quando disponível e caso não esteja disponível parte para Long Polling e os demais em sequência.
WebSocket é uma tecnologia que permite a comunicação bidirecional por canais full-dulplex sobre um único soquete Transmission Control Protocol (TCP). Ela foi projetada para ser executada em navegadores e servidores web que suportem o HTML5, mas pode ser usado por qualquer cliente ou servidor de aplicativos. A API WebSocket está sendo padronizada pelo W3C e o protocolo WebSocket está sendo padronizado pelo IETF.
Sendo assim apesar de termos tipos de transportes variantes o código fonte é sempre o mesmo, a responsabilidade de escolher o tipo de transporte fica por conta do SignalR, porém existe disponível uma maneira de definir o uso de um transporte específico.
Comunicação com PersistentConnection e Hubs
O ASP.Net SignalR oferece dois níveis de abstração de comunicação entre clientes e servidores, sendo o Hubs de alto nível e PersistentConnection de baixo nível.
O PersistentConnection representa um endpoint de comunicação com um único destinatário, agrupamentos ou mensagens de broadcast.
É necessário a configuração de uma rota customizada dentro do arquivo Global.asax.
A API de conexão (representada em código .Net pela classe PersistentConnection) dá ao desenvolvedor acesso direto a comunicação de baixo nível que o SignalR expõe, similar a forma de trabalhar com Sockets. O modelo de comunicação PersistentConnection será familiar para os desenvolvedores que usam API’s baseadas em conexão como o Windows Communcation Foundation – WCF.
Hubs é um pipeline de mais alto nível construído sobre a API PersistentConnection e que permite que o cliente e servidor chamem métodos entre si diretamente.
O SignalR lida com o envio através dos limites da máquina, permitindo que o cliente chame os métodos no servidor tão facilmente como métodos locais e vice-versa.
Se o seu aplicativo usa diferentes tipos de mensagens é recomendável que você use a classe Hub, de modo que você possa chamar métodos no client em vez de enviar uma mensagem explícita que precisa ser recebida, interpretada e posta em prática. Usando o modelo de comunicação Hubs será familiar para os desenvolvedores que usam API’s de invocação remota como. NET Remoting.
A escolha de um modelo de comunicação
A maioria dos aplicativos deve usar o modelo Hubs.
PersistentConnections podem ser utilizados nas seguintes circunstâncias:
- O formato da mensagem enviada necessita de ser controlado.
- O desenvolvedor prefere trabalhar com um modelo de envio de mensagens ao invés de um modelo de invocação remota.
- Um aplicativo existente que usa um modelo de mensagem está sendo portado para usar SignalR.
Como começar?
É necessário o Visual Studio 2010 SP1 ou o Visual Studio 2012
- Inicie um projeto ASP.Net MVC
- Instale o ASP.Net SignalR através do Nuget:
Install-Package Microsoft.AspNet.SignalR
- Adicione um Controller vazio
public class ChatController : Controller { public ActionResult Index() { return View(); } }
- Crie uma View
@{ ViewBag.Title = "Chat Básico"; } <label for="apelido" >Seu Apelido:</label><input type="text" name="apelido" id="apelido" /><br /> <label for="mensagem" >Mensagem:</label><input type="text" name="mensagem" id="mensagem" maxlength="100" /> <div id="chatWindow" style="width: 100%; height: 300px; overflow: scroll; border: 1px solid grey"></div> <!-- Referenciando os scripts adicionados ao Bundle --> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/SignalR") <!-- Referencia para o script de Hub criado automaticamente --> <script src="/signalr/hubs" type="text/javascript"></script> <script type="text/javascript"> $(function () { // Declarando um proxy de referencia ao Hub var chatHub = $.connection.chat; // Criando a função que será chamada pelo Hub para distribuir as mensagens aos clientes. // Por convenção as chamadas aos métodos são feitas em "camelCase" chatHub.transmitirMensagem = function (apelido, msg) { // Area do chat var chatWin = $("#chatWindow"); // Publicando a mensagem no chat chatWin.html(chatWin.html() + "<b>" + apelido + "</b>: " + msg + "<br />"); }; // Iniciando a conexão com o Hub $.connection.hub.start(); // Validando o botão enter $(document).keypress(function (e) { if (e.which == 13) { // Chamando o método de transmissão de mensagem no Hub chatHub.enviarMensagem($("#apelido").val(), $("#mensagem").val()); // Limpando o texto da mensagem. $("#mensagem").val(""); } }); }); </script>
- Crie um Hub
public class Chat : Hub { public void EnviarMensagem(string apelido, string mensagem) { Clients.TransmitirMensagem(apelido, mensagem); } }
Este exemplo está disponível para download aqui.
Ao executar o projeto abra uma segunda instância de um browser (experimente browsers diferentes) e teste a conversação do chat.
É incrivelmente fácil, não é mesmo?
O client chama métodos no Hub (server) como se fossem métodos locais e os métodos no server chamam métodos no client como se fossem métodos no servidor.
Quero conhecer e aprender mais!
Leia estes dois sites:
Assista este ótimo vídeo que foi gravado no TechEd 2012 por um dos desenvolvedores do ASP.Net SignalR.
Leia este Free eBook do MVP JM Aguilar, eu já li e recomendo (inglês)
Mais exemplos para baixar:
- Cotação de ações em tempo real
- Joguinho (viciante) feito com base no SignalR (open-source, baixe o fonte aqui)
Baixou o código fonte e teve alguma dúvida? Colocou a mão na massa e quer conhecer algum detalhe mais profundamente? Os desenvolvedores do ASP.Net SignalR respondem, eles ficam disponíveis neste chat, eu dei meu alô para eles e fui respondido:
O exemplo do chat é o mais simples e clássico para usar na comunicação em tempo real, porém as possibilidades de utilização são inúmeras, adicione o ASP.Net SignalR em seu conhecimento técnico e faça proveito.
Este foi um post introdutório, falarei muito mais deste assunto em outros artigos, estou preparando uma aplicação especial para disponibilizar na comunidade utilizando ASP.Net SignalR e também tem minha palestra no Visual Studio Summit 2013 (será gravada e disponibilizada aqui).
Dê seu feedback e tire suas dúvidas nos comentários abaixo.
Gostou deste artigo? Compartilhe 😉
Referências