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.
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.