Desenvolvimento - ASP. NET

SignalR: Desenvolvendo um chat em ASP.NET

Neste artigo iremos desenvolver uma aplicação que simule a função de um chat utilizando SignalR em Asp.Net

por Guilherme Seabra



Existem diversas dificuldades ao se desenvolver uma aplicação web real-time, entre as principais estão a latência de rede entre o seu usuário e seus servidores, o volume de conexões com o servidor, a maneira que o servidor trata as requisições que ficam esperando uma atualização, e a maneira que a interface client de sua aplicação atualiza as novas informações.

Interatividade em tempo real, acesso de múltiplos usuários atuando colaborativamente e acesso assíncrono são algumas das dificuldades que temos que transpor para criarmos uma aplicação Web com uma experiência rica ao usuário final, para isso foi o SignalIR por dois funcionários da Microsoft : Damian Edwards e David Fowler.

SignalR é uma biblioteca assíncrona voltada para aplicações .NET que foi criada com o intuito de ajudar a criar aplicações web interativas com troca de mensagens em tempo real para multi-usuários. Com SignalR podemos trabalhar praticamente como uma conexão sempre aberta onde no servidor poderemos detectar quando um novo cliente se conectou e se desconectou, enviar e receber mensagens dos clientes, etc.

Na verdade, as conexões persistentes realmente não existem sendo apenas uma abstração criada pela SignalR que faz o trabalho sujo por trás dos panos mantendo a conexão dos clientes com o servidor usando mecanismos de transportes (WebSockets) que são um conjunto de tecnologias usadas para manter a 'ilusão' da conexão contínua.

Essa tecnologia ainda esta em desenvolvimento e não funciona em todos os navegadores mas dá suporte ao SilverLight, WinRT, JavaScript, WindowsPhone7.

Basicamente, o SignalR funciona através do gerenciamento de uma conexão persistente entre o servidor e o cliente.

Primeiramente devemos instalar o complemento do SignalIR ao VisualStudio 2012, Microsoft ASP.NETeWeb Tools 2012.2 for Visual Studio 2012que pode ser baixado usando Web Plataform Installer.

Primeiramente para o desenvolvimento do chat vamos instalar o SignalIR:


Figura 1: Tela inicial do Web Plataform Installer 4.5.

Abaixo podemos ver os pré-requisitos do processo de instalação do Web Plataform Installer 4.5.

Figura 2: Na tela de pré-requisitos é necessário marcar a checkbox e clicar no botão “Aceito”.

Abaixo vemos a tela de finalização da instalação do Web Plataform Installer 4.5.

Figura 3: Na tela de finalização do Web Plataform Installer 4.5 é necessário clicar em “Concluir”.


Agora vamos começar o desenvolvimento da aplicação.

Figura 4: Vamos criar um novo projeto em File -> New -> Project.

Primeiro, crie um novo projeto em Asp.net:

Figura 5: Vamos selecionar a opção C# -> Web -> Asp.NET Empty Web Application.

Agora, insira um novo item no projeto solução:

Figura 6: Vamos agora com o botão direito em cima do projeto e adicionar uma nova classe chamada “ChatHub”.

Vamos agora inserir o seguinte código dentro da classe “ChatHub”, para criar a rotina de conexão entre cliente/servidor.

Listagem 1: Inserindo o conteúdo da nova classe ChatHub:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
namespace ChatSignalIR
{
    public class ChatHub : Hub
    {
        public void Send(string nome, string mensagem)
        {
            Clients.All.broadcastMessage(nome,mensagem);
        }
    }
                                               
}

Vamos inserir o projeto uma nova pagina html chamada de “HtmlChat”, essa tela será a pagina de comunicação do chat.


Figura 7: Inserindo ao projeto uma nova página Html.

Após isso tudo, é necessário codificar a página HTML, vejamos como ficará o código abaixo.

Listagem 2: Codificando a página Html.

                 <!DOCTYPE html>
  <html>
  <head>
      <title>Chat SignalR Simples</title>
      <style type="text/css">
          .container {
              background-color: #99CCFF;
              border: thick solid #808080;
              padding: 20px;
              margin: 20px;
          }
      </style>
  </head>
  <body>
      <div class="container">
          <input type="text" id="mensagem" />
          <input type="button" id="enviamensagem" value="Enviar" />
          <input type="hidden" id="exibenome" />
          <ul id="discussion">
          </ul>
      </div>
      <!--Script references. -->
      <!--Reference the jQuery library. -->
      <script src="/Scripts/jquery-1.8.2.min.js" ></script>
      <!--Reference the SignalR library. -->
      <script src="/Scripts/jquery.signalR-1.0.0.js"></script>
      <!--Reference the autogenerated SignalR hub script. -->
      <script src="/signalr/hubs"></script>
      <script type="text/javascript">
          $(function () {
              // Declar um proxy para referenciar o  hub. 
              var chat = $.connection.chatHub;
              // Cria a função que o run pode chamar para mensagens de broadcast
              chat.client.broadcastMessage = function (nome, mensagem) {
                  // Html encode exibe o nome e mensagem
                  var encodednome = $('<div />').text(nome).html();
                  var encodedMsg = $('<div />').text(mensagem).html();
                  $('#discussion').append('<li><strong>' + encodednome
                      + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
              };
              // Pega o nome do usuário e armazena 
              $('#exibenome').val(prompt('Informe o seu nome :', ''));
              // Define o focus inicial para a caixa de mensagem
              $('#mensagem').focus();
              // Inicia a conexão
              $.connection.hub.start().done(function () {
                  $('#enviamensagem').click(function () {
                      // Chama o método Send no  hub. 
                      chat.server.send($('#exibenome').val(), $('#mensagem').val());
                      // Limpa o textbox e reseta o focus para o proximo comentario
                      $('#mensagem').val('').focus();
                  });
              });
          });
      </script>
  </body>
  </html>

Pronto, temos nossa aplicação pronta, agora é só rodar e testar essa nova função:


Figura 8: Página Web do chat em execução.

Esse foi um exemplo prático de como criar um chat utilizando o SignlIR. Espero que tenham gostado, qualquer dúvida vocês podem entrar em contato comigo pelo email: guilhermemaiaseabra@gmail.com ou via Skype: guilhermemaiaseabra, bom desenvolvimento a todos e até a próxima.

Guilherme Seabra

Guilherme Seabra - Cursando Bacharelado em Sistema de Informação - FESP/UEMG. Programador .Net/C# possui conhecimentos em SqlServer, JavaScript, Html e CSS. Atualmente trabalha como Programador na empresa MGF informatica.