Quando dobbiamo restituire una risposta particolarmente lunga, costituita da una collection di elementi, una delle possibili opzioni è quella di restituirla sotto forma di uno stream. Il beneficio di questo approccio è che un client possa effettuare un download progressivo della risposta, senza dover attendere che il server abbia finito di generarla.
Si tratta, in buona sostanza, di della stessa tecnica utilizzata per simulare push notification dal server verso il client tramite Server Sient Events (SSE).
La buona notizia è che tutto ciò che dobbiamo fare in ASP.NET Core per implementarla, è quella di creare un endpoint Web API che restituisca un IAsyncEnumerable. Per esempio, possiamo modificare il classico WeatherForecast endpoint del template di default di Visual Studio nel modo seguente:
[HttpGet]
public async IAsyncEnumerable<WeatherForecast> Get()
{
for (int i = 0; i < 20; i++)
{
await Task.Delay(1000);
yield return new WeatherForecast
{
Date = DateTime.Now.AddDays(i),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
};
}
}Se a questo punto apriamo questo URL dal browser, dovremo attendere circa 20 secondi prima di ottenere la risposta. Questo perché, per default, il browser non attiva lo streaming e attende il completamento della risposta prima di visualizzare qualcosa.
Tuttavia, ci basta aggiungere il seguente header, per cambiare radicalmente il comportamento:
this.Response.ContentType = "text/event-stream";
Ora, visualizzando questo endpoint, potremo vedere come la risposta si componga gradualmente, senza dover attendere che tutti gli elementi siano stati generati.
Questo sistema può essere molto utile combinato al supporto dell'ecosistema .NET per IAsyncEnumerable: per esempio, possiamo utilizzarlo per restituire i risultati di una query di Entity Framework (https://www.linqitalia.com/script/523/Utilizzare-Asynchronous-Stream-Entity-Framework-Core.aspx) man mano che li leggiamo dal database.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Abilitare il rolling update su Azure Functions flex consumption
Introduzione a GitHub Copilot CLI
Semplificare i deployment con le label in Azure Container App
Canary release con .NET Aspire
Building Custom Developer Agents
Keynote Global Azure 2026 - ASPItalia.com
Arricchire l'interfaccia di .NET Aspire
Logica Graceful Degradation in HTML e CSS
Gestire trasferimenti cloud con Azure Storage Mover
Filtrare i dati in ASP.NET Core usando OpenTelemetry su Azure Monitor
Creare una cache temporanea in JavaScript
Welcome to Future Dev Day 2026
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Caricamenti veloci da CDN e fallback locale con ASP.NET Core
- Utilizzare dati in formato XML in XAML
- Accedere a dati esposti con WebService con Silverlight 1.0


