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/OnDisconnectedAsyncpara 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
- Hubs e conexões do SignalR
- Grupos, usuários e gerenciamento de conexões
- Hubs fortemente tipados
- Escalonamento com Redis Backplane