ASP.NET SignalR – Introdução e Utilização

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:

ASP.Net SignalR

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.

ASP.Net SignalR

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:

  1. WebSockets
  2. Long Polling
  3. Server Sent Events
  4. 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.

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.

ASP.Net SignalR

É 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:

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:

ASP.Net SignalR

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

46 pensou em “ASP.NET SignalR – Introdução e Utilização

  1. Parabéns cara mais uma vez.

    Pow mano queria muito ir na palestra sua la na Microsoft dia 25. Sou novato aqui em SP tenho medo ainda de ir ate os lugares. hehehe… Mas vou fazer o possível para aparecer la.

    Show de bola mesmo. Parabéns.

    • Fala Eduardo,

      Obrigado pelo feedback 😀
      Todas as palestras serão gravadas e disponibilizadas gratuitamente, porém ir presencialmente ao evento lhe proporciona uma experiência maior, contato com a comunidade técnica e etc…

      Faz um esforço ai, fica muito próximo aos pontos de transporte público, espero lhe ver por lá!

      Abraços.

  2. Ótimo texto, muito bem explicado.
    Eu sempre tenho a impressão que o pessoal da comunidade .NET é fechado, metido, mas o seu conteúdo sempre é bem explicativo.

    • Fala Rodrigo, obrigado pelo feedback.

      Em partes concordo com você. Existem muitas pessoas / comunidades que não são tão colaborativas quanto esperamos.

      Eu como indivíduo trabalho para o fortalecimento da comunidade e do crescimento profissional de todos. Acredito ser esse o espírito 😀

      Abraços.

    • Olá Natália,

      Para eu te ajudar vou precisar saber mais detalhes do problema. Onde você publicou? Na sua maquina local funcionou?
      Precisa confirmar se você subiu todas as dependências necessárias para o SignalR funcionar.

      Abraços.

  3. Muito bom Eduardo, excelente post.
    Você tem algum exemplo de signalR com database notification em webforms?

    Parabéns pelo trabalho

  4. Caro Eduardo, parabéns pelo post! Gostaria de saber sobre a escalabilidade do SIgnalR exemplo: tenho uma aplicação com 10 clientes para serem atualizados via chamada de um método na classe herdada de HUB. Se tivermos 1.000, como será a resposta? e se tivermos 50.000? etc. Obrigado!

  5. Fala Eduardo, tudo bem?

    Estou no começo da jornada com o SignalR, gostaria de tirar algumas dúvidas com você, como está aqui, está ativo o site ?
    Talvez até mesmo uma consultoria p/ o meu setor de desenvolvimento….
    Aguardo o feedback
    Abraço

  6. Parabéns.
    Muito bom para quem quer ter uma luz sobre SignalR e não se safa a Inglês.
    Que haja mais conteúdo em português desta qualidade 😀

  7. Ótimo texto Eduardo Pires, mas assim como a natália não consigo hospedar… já adicionei todas as dlls… js.. tudo, localmente funciona…. acho que pode ser alguma coisa na rota que configuro no global.asax, porem sou meio leigo no assunto…. se puder me ajudar fico grato.

    Obrigado desde já

    Paulo César

  8. Ola Eduardo,

    Antes de mais, parabéns pelo artigo, muito bom mesmo.

    Gostaria de te pedir a tua ajuda para conexão do SignalR com base de dados SQL Server 2008. Estou com muito problema e preciso mesmo de resolver isto.

    Obrigada desde já.

  9. Parabéns, Eduardo! Muito bom.

    Eu consegui desenvolver o chat, porém, não consegui avançar na parte privada.
    Como eu faço o chat privado, encontrei o Context.ConnectionId, mas não evoluiu muito. Poderia me ajudar?

  10. Gostaria de aplicar este método para a criação de um mural semelhante a rede social para um trabalho acadêmico, se tem algo que eu possa aproveitar do chat, ou algum outro material de apoio para unir a este está muito bom parabéns.

  11. Lembrando que o SignalR está atualizado;

    O Hub agora ficaria desta forma:

    public class Chat : Hub
    {
    public void EnviarMensagem(string apelido, string mensagem)
    {
    Clients.All.TransmitirMensagem(apelido, mensagem);
    }
    }

  12. Eu usei o signalr para feedback no.cliente para tarefas de longa duração. No.meu caso. Ao gerar iptu. Infornar em tempo real dados de quantos registros lidos. Quanto valor ja lançado. Quanto de progresso da tarefa.

  13. Olá Eduardo muito bom o seu post e bem explicado.

    Me tire um dúvida.
    Desenvolvi um projeto com signalr para mandar notificação para usuário específico.

    Suponha que usuário mandou notificação para um usuário não logado.
    O que fazer quando o usuário não está logado, como devo mandar notificação ?

  14. por favor preciso muito da sua ajuda, fui tentar por no meu projeto instalei agora esta dando erro em todo o projeto, nao sei oque fazer ja tentei desinstalar e tudo mais T.T

  15. Muito boa a explicação, funcionou perfeitamente, agora eu queria saber, como seria o uso dessa comunicação com um app /android.java ?

Os comentários estão fechados.