La comunicazione attraverso internet avviene per la maggior parte attraverso uno scambio client->server: il client preparando una richiesta, e fornendola al server, attenderà una risposta per mostrarne i dati. Ma nei casi in cui è richiesto l'aggiornamento real-time, questa prassi può non bastare. In applicazioni dove l'obiettivo è tenere aggiornato il layout rispetto allo stato attuale dei dati sul server, la prima soluzione, ma anche la più prona ad errori, è il polling: il client attraverso un loop, ad intervalli regolari, invia richieste al server.
Con .NET abbiamo già un'opzione migliore, che negli anni si è confermata un solido pilastro per questo tipo di comunicazione: SignalR. Attraverso la creazione di una WebSocket si apre un canale di comunicazione bi-direzionale, dove i due attori possono scambiarsi informazioni. Questa pratica non è gratuita: richiede un'architettura composta da WebSocket, gruppi, hub in cui inserire metodicamente i client e gestire l'invio dei messaggi.
Con i SSE (Server-Sent Events) troviamo invece un'alternativa facile, veloce e soprattutto pratica, per gestire una casistica real-time come una dashboard o notifiche provenienti dal server. Come dice il nome la comunicazione è mono-direzionale: il client una volta effettuata una chiamata HTTP, che verrà tenuta aperta per tutta la durata della comunicazione, potrà ricevere ed interpretare gli eventi che verranno inviati dal server.
const evtSource = new EventSource("/mia-api");
evtSource.onmessage = (event) => {
console.log(event);
};app.MapGet("/mia-api", (CancellationToken cancellationToken) =>
{
// funzione privata
async IAsyncEnumerable<HeartRateRecord> GetHeartRate(
[EnumeratorCancellation] CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
var heartRate = Random.Shared.Next(60, 100);
yield return HeartRateRecord.Create(heartRate);
await Task.Delay(2000, cancellationToken);
}
}
return TypedResults.ServerSentEvents(
GetHeartRate(cancellationToken),
eventType: "heartRate");
});Il codice mostrato, ad interfalli regolari di 2 secondi, crea un numero casuale e lo invia al client. Restituendo un TypedResults.ServerSentEvents abbiamo anche la possibilità di specificare, esternamente all'oggetto restituito, la tipologia dell'evento, che verrà aggiunta al body di risposta.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestione delle scrollbar dinamiche in HTML e CSS
Escludere alcuni file da GitHub Copilot
EF Core in .NET 10: evoluzione continua per un framework maturo
Creare una cache temporanea in JavaScript
Blazor e Static Web Assets in .NET 10
Semplificare i deployment con le label in Azure Container App
Analizzare il contenuto di una issue con GitHub Models e AI
Keynote .NET Conference Italia 2025
Personalizzare le pagine di errore su Azure App Service
Integrazione di Copilot in .NET Aspire
Creare un agente A2Acon Azure Logic Apps
DevSecOps per .NET: dalla teoria alla pratica


