Costruire endpoint SSE in ASP.NET Core

di Morgan Pizzini, in ASP.NET Core,

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

Visualizza/aggiungi commenti

| Condividi su: LinkedIn, Facebook

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi