loading experience

ASP.NET Core

SignalR: applicazioni in tempo reale con ASP.NET Core

Notifiche, chat e cruscotti che si aggiornano da soli: come funziona SignalR e come usarlo bene.

SignalR: applicazioni in tempo reale con ASP.NET Core

SignalR permette al server di inviare messaggi ai client nel momento in cui accade qualcosa, senza che il browser debba chiedere continuamente aggiornamenti. Sceglie da solo il trasporto migliore: WebSocket quando disponibile, altrimenti alternative compatibili.

Il server avvisa i client nel momento in cui qualcosa cambia.
Il server avvisa i client nel momento in cui qualcosa cambia.

Un hub

public class NotificheHub : Hub
{
    public async Task EntraNelGruppo(string reparto)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, reparto);
    }
}

builder.Services.AddSignalR();
app.MapHub<NotificheHub>("/hubs/notifiche");

Inviare dal server, da qualsiasi punto

Con IHubContext un servizio applicativo può notificare i client anche fuori dall'hub, per esempio quando un ordine cambia stato:

public class OrdiniService(IHubContext<NotificheHub> hub)
{
    public async Task SpeditoAsync(Ordine o)
    {
        // ...aggiorna il database...
        await hub.Clients.Group("logistica").SendAsync("ordineSpedito", o.Id);
    }
}
const conn = new signalR.HubConnectionBuilder()
    .withUrl("/hubs/notifiche")
    .withAutomaticReconnect()
    .build();

conn.on("ordineSpedito", id => mostraAvviso(`Ordine ${id} spedito`));
await conn.start();
await conn.invoke("EntraNelGruppo", "logistica");

Buone pratiche

  • Autentica le connessioni e controlla i permessi in ogni metodo dell'hub: un client può chiamare qualsiasi metodo pubblico.
  • Invia eventi piccoli (identificativi, stati) e lascia che il client carichi i dettagli con una normale chiamata.
  • Con più istanze del server serve un backplane, come Redis o Azure SignalR Service, per far arrivare i messaggi a tutti.
  • Prevedi la riconnessione: dopo un'interruzione il client deve recuperare ciò che si è perso.
Commenti (0)

Nessun commento ancora.

Lascia un commento