0Pricing
C# Academy · Aula

Hubs e conexões do SignalR

Crie um hub do SignalR, mapeie-o no ASP.NET Core e estabeleça conexões WebSocket a partir de clientes JavaScript e .NET.

Hubs e conexões do SignalR é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

O que é SignalR

SignalR é uma biblioteca do ASP.NET Core que adiciona comunicação bidirecional em tempo real entre o servidor e os clientes. Ela escolhe automaticamente o melhor transporte — WebSockets, eventos enviados pelo servidor ou sondagem longa — com base no que os dois lados oferecem suporte.

Configurando o SignalR

Adicione SignalR aos serviços e mapeie um ponto de extremidade de hub. Um hub é uma classe que gerencia conexões de clientes e chamadas de métodos.

builder.Services.AddSignalR();

var app = builder.Build();

app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");

app.Run();

Criando um hub

Herede de Hub. Os métodos do hub são chamados pelos clientes. A propriedade Context fornece informações sobre a conexão, e Clients permite enviar mensagens de volta.

using Microsoft.AspNetCore.SignalR;

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        // Broadcast to ALL connected clients
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }

    public override async Task OnConnectedAsync()
    {
        await Clients.Caller.SendAsync("Welcome",
            $"Connected as {Context.ConnectionId}");
        await base.OnConnectedAsync();
    }
}

Cliente JavaScript

O cliente oficial JavaScript do SignalR cria uma conexão, registra manipuladores de eventos e inicia a conexão. Os métodos definidos no hub podem ser chamados do JavaScript.

// npm install @microsoft/signalr
import * as signalR from "@microsoft/signalr";

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/hubs/chat")
    .withAutomaticReconnect()
    .build();

connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user}: ${message}`);
});

await connection.start();
await connection.invoke("SendMessage", "Alice", "Hello!");

Cliente SignalR do .NET

O cliente .NET funciona da mesma maneira — é útil para comunicação em tempo real entre serviços ou para aplicações de computador e dispositivos móveis.

// dotnet add package Microsoft.AspNetCore.SignalR.Client

var connection = new HubConnectionBuilder()
    .WithUrl("https://myapp.com/hubs/chat")
    .WithAutomaticReconnect()
    .Build();

connection.On<string, string>("ReceiveMessage", (user, msg) =>
    Console.WriteLine($"{user}: {msg}"));

await connection.StartAsync();
await connection.InvokeAsync("SendMessage", "Bot", "Connected!");

Enviando para clientes específicos

A propriedade Clients tem métodos para direcionar mensagens a conexões específicas, aos autores das chamadas ou a todos os clientes conectados, exceto os especificados.

// To the caller only
await Clients.Caller.SendAsync("YouSaid", message);

// To a specific connection
await Clients.Client(connectionId).SendAsync("PrivateMsg", msg);

// To all except caller
await Clients.Others.SendAsync("ReceiveMessage", user, message);

// To multiple specific connections
await Clients.Clients(new[] { id1, id2 })
             .SendAsync("DirectMsg", msg);

Contexto do hub: enviando de fora do hub

Injete IHubContext<T> em serviços ou trabalhadores em segundo plano para enviar mensagens de fora da classe do hub — algo essencial para envios iniciados pelo servidor.

public class NotificationService
{
    private readonly IHubContext<ChatHub> _hub;

    public NotificationService(IHubContext<ChatHub> hub) => _hub = hub;

    public async Task BroadcastAlertAsync(string alert)
    {
        // Send to all clients from a background service
        await _hub.Clients.All.SendAsync("SystemAlert", alert);
    }
}

Eventos do ciclo de vida da conexão

Substitua OnConnectedAsync e OnDisconnectedAsync para acompanhar conexões, manter o estado ou liberar recursos.

public override async Task OnConnectedAsync()
{
    _connections.TryAdd(Context.ConnectionId, GetUserName());
    await Clients.All.SendAsync("UserJoined", GetUserName());
    await base.OnConnectedAsync();
}

public override async Task OnDisconnectedAsync(Exception? ex)
{
    _connections.TryRemove(Context.ConnectionId, out var user);
    await Clients.All.SendAsync("UserLeft", user);
    await base.OnDisconnectedAsync(ex);
}

private string GetUserName() =>
    Context.User?.Identity?.Name ?? Context.ConnectionId;

Reconexão automática

Ative a reconexão automática no cliente para lidar de forma adequada com desconexões temporárias. Você pode personalizar os intervalos entre as tentativas.

// JavaScript client
const conn = new signalR.HubConnectionBuilder()
    .withUrl("/hubs/chat")
    .withAutomaticReconnect([0, 2000, 5000, 10000, 30000]) // retry delays in ms
    .build();

conn.onreconnecting(err => console.warn("Reconnecting...", err));
conn.onreconnected(id  => console.log("Reconnected:",    id));
conn.onclose(err       => console.error("Disconnected:", err));

Autenticação com SignalR

O SignalR respeita o componente intermediário de autenticação do ASP.NET Core. Adicione [Authorize] à classe do hub ou use o manipulador JWT que oferece suporte a tokens em strings de consulta (necessários para a autenticação por WebSocket).

[Authorize]
public class PrivateHub : Hub
{
    public Task SendMessage(string msg)
    {
        var user = Context.User!.Identity!.Name;
        return Clients.All.SendAsync("Msg", user, msg);
    }
}

// JWT via query string (WebSocket requirement):
builder.Services.AddAuthentication().AddJwtBearer(opt =>
{
    opt.Events = new JwtBearerEvents
    {
        OnMessageReceived = ctx =>
        {
            var token = ctx.Request.Query["access_token"];
            if (!string.IsNullOrEmpty(token))
                ctx.Token = token;
            return Task.CompletedTask;
        }
    };
});

Verificação rápida

Como você envia uma mensagem do SignalR a partir de um serviço em segundo plano, fora da classe do hub?

Recapitulação: hubs e conexões do SignalR

Principais conclusões:

  • O SignalR escolhe automaticamente o melhor transporte (WebSockets, SSE e sondagem longa)
  • Os métodos do hub podem ser chamados pelos clientes; Clients.* direciona mensagens a destinatários específicos
  • Injete IHubContext<T> para enviar mensagens de fora do hub
  • Substitua OnConnectedAsync/OnDisconnectedAsync para gerenciar o ciclo de vida
  • Use withAutomaticReconnect() para obter conexões de cliente resilientes
  • A autenticação JWT por string de consulta é necessária para conexões WebSocket

Perguntas Frequentes

A aula “Hubs e conexões do SignalR” é grátis?

Sim — o texto completo de “Hubs e conexões do SignalR” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Hubs e conexões do SignalR”?

Crie um hub do SignalR, mapeie-o no ASP.NET Core e estabeleça conexões WebSocket a partir de clientes JavaScript e .NET. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Hubs e conexões do SignalR”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Hubs e conexões do SignalR
  2. Grupos, usuários e gerenciamento de conexões
  3. Hubs fortemente tipados
  4. Escalonamento com Redis Backplane
← Voltar para C# Academy