Compartilhar via


Introdução, tipos de conexão e exemplo simples de utilização

SignalR, o que é?

Basicamente, é uma biblioteca em .Net e de código livre, que viabiliza atualizações/notificações asíncronas em tempo real para aplicações web. Ou seja, ela permite enviar dados e informações entre client/server em tempo real. Legal em!

A Microsoft já oferece suporte ao SignalR, o mesmo abrange aplicações em Javascript, Silverlight, .Net, Windows Phone 7 e WinRT. Além da Microsoft a comunidade open source forneceu apoio para Mono e iOS também.

 

Mas o .Net Framework 4.5 não suporta Websockets, utilizado para recursos em tempo real?

Sim, e aconselho o estudo e aprendizado em Websockets, onde, com o framework 4.5 é possivel utilizar seus recursos com o namespace System.Web.WebSockets, porém, trabalhar com Websockets requer no mínimo o framework 4.5 e o IIS8 ou IIS8 Express para utiliza-lo. Sem contar que infelizmente apenas o Chrome 16++, Firefox 11++ e IE 10 o suportam.

Desta forma, hoje, estou utilizando o SignalR para aplicações em tempo real.

 

Mas em qual tipo de aplicação eu posso utiliza-lo

As mais comuns são chats e notificações de mensagens, porém nada o impede de utiliza-lo em seu favor para qualquer tipo de solução. 

O que eu preciso para utiliza-lo

Para sua utilização, é necessário apenas:

  • Referência ao namespace Microsoft.Web.Infrastructure;
  • jQuery 1.6 ou superior.

A instalação do SignalR pode ser realizada pelo Nuget com o comando Install-Package SignalR pelo Package Manager Console. Observe que ao realizar a instalação, as dependências do jQuery e Infrastructure são atualizadas/instaladas também.

 

PersistentConnection e Hub

O SignalR oferece basicamente dois tipos de conexão, Hub (alto-nível) e PersistentConnection (baixo-nível). Analisando superficialmente ambas, podemos ver que:

PersistentConnection faz uso da interface IHttpHandler, com isso, podemos disponibilizar um ponto final de acesso via Http, porém, para tanto, é necessário a configuração de uma rota customizada dentro do arquivo Global.asax. Utilizando este tipo de conexão, podemos sobrepor diversas operações e métodos pré-definidas pelo SignalR, permitindo enviar/receber solicitações dos clientes.

Já a conexão com Hub disponibiliza a capacidade de enviar diversos tipos de mensagens entre cliente/servidor. Com esta conexão não é necessário a configuração de uma rota customizada, pois o próprio SignalR cria a estrutura necessária para troca de mensagens utilizando o caminho “~/signalr/hubs”. Podemos também adicionar diversas operações customizadas, obtendo maior flexibilidade para codificação.

 

Exemplo bem simples de utilização

Vamos criar um recurso bem simples, uma página que envia uma mensagem, e exibe em tempo real a todos os usuários que estiverem na página as mensagens adicionadas.

 Primeiro vamos criar nossa classe pública para servir de Hub (conexão de alto-nível), expondo os métodos de solicitações pelo cliente, e suas chamadas de respostas:

01.using SignalR.Hubs;02. 03.namespace ProjetoSignalR04.{05.    [HubName("mensagemHub")]06.    public class MensagemHub : Hub07.    {08.        public void EnviaMensagem(string sessionId, string mensagem)09.        {10.            Clients.obtemMensagem(sessionId, mensagem);11.        }12.    }13.}

Sem muita complicação e de fácil entendimento, criamos uma classe que herda a classe abstrata Hub. Em seguida criamos o método EnviaMensagem, que será chamado pelo cliente, e posteriormente será chamado a função ObtemMensagem em todos os clientes que estiverem na mesma página!

Isso mesmo, estamos do lado do servidor e dizendo a todos os clientes para chamar a função javascript obtemMensagem(). Neste bloco de código estamos chamando o cliente a partir do servidor, enviando o nome do método a ser chamado através da nossa conexão estabelecida.

Continuando o código, a classe acima ficará bem mais simples de entender! Vamos agora adicionar as referências do SignalR em nossa página:

1.<script src="../../../../Scripts/jQuery/jquery.signalR.min.js" type="text/javascript"></script>2.<script src="../../../../signalr/hubs" type="text/javascript"></script>

Atente-se que a ultima linha, que aponta para o caminho “~/signalr/hubs” não existe, ele se responsabiliza em criar a estrutura a ser utilizada em run-time, se fossemos utilizar uma PersistentConnection teríamos que definir manualmente a rota a ser utilizada. Outro ponto importante, as referências do SignalR devem ser definidas após a referência do jQuery.

Em nosso script da página, adicionamos o seguinte código:

01.// Cria objeto de conexão com o server (SignalR)02.var realTimeHub = $.connection.mensagemHub;03. 04.// Função que será chamada automaticamente quando uma nova mensagem for adicionada05.// Esta função será chamada através de uma requisição do server06.realTimeHub.obtemMensagem = function (sessionId, mensagem) {07.    // Inclui mensagem apenas se for outro usuário08.    if (sessionId != $("#sessionId").val())09.        $("#mensagens").append(mensagem);10. 11.};12. 13.// Inicia a conexão com o server (SignalR)14.$.connection.hub.start();15. 16.// Evento de click para adicionar uma nova mensagem17.$("#btnEnviaMsg").click(function () {18.    realTimeHub.EnviaMensagem($("#sessionId").val(), $("#mensagem").val());19.});

Bem tranquilo e simples não? Porém, veja alguns detalhes:

  • O nome da conexão deve ser o mesmo da classe Hub, porém, deve iniciar com minúscula, e não maiúscula como a classe. Exemplo: Nossa classe chama-se MensagemHub, já a conexão no lado cliente, deve ser mensagemHub.
  • Estou utilizando o SessionId apenas para saber no retorno se o usuário é o mesmo do request (não obrigatório).

Links

SignalR Github https://github.com/SignalR/SignalR

SignalR Wiki https://github.com/SignalR/SignalR/wiki

SignalR Nuget http://nuget.org/packages/SignalR

 

Rafael Zaccanini
MTAC – Microsoft Technical Audience Contributor
Blog: http://www.rafaelzaccanini.net

**Twitter: **@rafaelzaccanini
Facebook: http://www.facebook.com/RafaelZaccaniniNet