signalr:-comunicación-en-tiempo-real-para-aplicaciones-.net

Volver

Última actualización: 2026-07-31 15:28


SignalR: Comunicación en Tiempo Real para Aplicaciones .NET

Introducción

En el desarrollo moderno de aplicaciones web, la comunicación en tiempo real se ha vuelto una necesidad cada vez más común. Chats, dashboards con datos en vivo, notificaciones instantáneas — todos estos casos requieren que el servidor pueda enviar datos al cliente sin que este tenga que solicitarlos activamente.

SignalR es la respuesta de Microsoft a esta necesidad. Es una librería incluida en ASP.NET Core que abstrae la complejidad de mantener conexiones persistentes entre cliente y servidor. A partir de .NET 8 forma parte del framework sin necesidad de paquetes adicionales en el servidor, y su versión más reciente acompaña a .NET 10 (noviembre 2025).

¿Cómo funciona SignalR?

SignalR utiliza una estrategia de transporte con fallback automático. Intenta establecer la conexión usando el protocolo más eficiente disponible, en este orden:

  1. WebSockets — la opción más eficiente, conexión bidireccional persistente
  2. Server-Sent Events (SSE) — solo del servidor al cliente, útil cuando WebSockets no está disponible
  3. Long Polling — el fallback universal, funciona en cualquier ambiente

Esta negociación ocurre automáticamente. Vos definís la lógica, SignalR elige el mejor canal.

El concepto central es el Hub: una clase del lado del servidor que actúa como punto de comunicación. Los clientes se conectan al Hub y pueden invocar métodos en el servidor, y el servidor puede invocar métodos en los clientes conectados.

Implementación básica

Servidor (ASP.NET Core):

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

// Program.cs
builder.Services.AddSignalR();
app.MapHub<ChatHub>("/chathub");

Cliente (JavaScript/TypeScript):

Primero instalar el paquete npm oficial:

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

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

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

await connection.start();
await connection.invoke("SendMessage", "Nombre", "Hola!");

Con estas pocas líneas tenés un canal de comunicación bidireccional funcionando.

Grupos y conexiones específicas

SignalR permite enviar mensajes de forma selectiva:

// A todos los clientes
await Clients.All.SendAsync("Notify", data);

// A un cliente específico
await Clients.Client(connectionId).SendAsync("Notify", data);

// A un grupo
await Groups.AddToGroupAsync(Context.ConnectionId, "sala-1");
await Clients.Group("sala-1").SendAsync("Notify", data);

// A todos menos el que envió
await Clients.Others.SendAsync("Notify", data);

Escalabilidad con Azure SignalR Service o Redis

Cuando necesitás escalar horizontalmente (múltiples instancias del servidor), el estado de las conexiones se vuelve un problema. Tenés dos opciones:

Opción 1: Azure SignalR Service (recomendado si ya estás en Azure)

builder.Services.AddSignalR()
    .AddAzureSignalR("connection-string");

Opción 2: Redis backplane (self-hosted, mismo datacenter)

dotnet add package Microsoft.AspNetCore.SignalR.StackExchangeRedis
builder.Services.AddSignalR()
    .AddStackExchangeRedis("localhost:6379");

⚠️ Para producción, el Redis backplane solo se recomienda cuando el servidor Redis corre en el mismo datacenter que la app SignalR. De lo contrario, la latencia de red degrada el rendimiento.

Conclusión

SignalR simplifica enormemente la implementación de funcionalidades en tiempo real en el ecosistema .NET. Su sistema de fallback automático garantiza compatibilidad universal, mientras que su API intuitiva de Hubs permite enfocarse en la lógica de negocio. Para proyectos que necesitan escalar, tanto Azure SignalR Service como Redis backplane extienden esta simplicidad al entorno distribuido.