Response streaming con Blazor e .NET 10

di Morgan Pizzini, in ASP.NET Core,

Il response streaming è quella pratica che permette di leggere la risposta HTTP man mano che arriva dal server, invece di aspettare che l?intero contenuto venga scaricato in memoria. Nelle versioni precedenti di Blazor lo streaming era opt-in, richiedeva cioè l'abilitazione esplicita. In .NET 10 lo streaming è attivo di default, andando a migliorare le performance, l'utilizzo della memoria e un maggior controllo delle risposte di grandi dimensioni.

Questa nuova visione introduce una modifica importante: la chiamata verso un controller, o servizio API, che forniva questa tipologia di risposta, viene letta e codificata con una classe diversa.

// Action con risposta in stream
[HttpGet("stream-numbers")]
public async IAsyncEnumerable<int> StreamNumbers()
{
    for (int i = 1; i <= 10; i++)
    {
        await Task.Delay(100); // Simulate async work
        yield return i;
    }
}

var stream = await response.Content.ReadAsStreamAsync();
// oggetto stream:
// fino a .NET 10 MemoryStream
// dopo .NET 10 BrowserHttpReadStream

Anche se le due classi condivido le firme di molti metodi, in BrowserHttpReadStream non troviamo alcuna operazione sincrona: le chiamate come stream.Read(buffer); o stream.Read(Span); non saranno più supportate ed abbiamo tre modalità diverse per aggirare l'errore: leggere in asincrono, inserire la risposta in un memory stream o disabilitare la funzionalità.

// lettura asincrona
var bytesRead = await stream.ReadAsync(buffer);

// creazione memory stream e lettura sincrona successiva
using var memoryStream = new MemoryStream();
await stream.CopyToAsync(memoryStream);

// disabilitazione
var requestMessage = new HttpRequestMessage(HttpMethod.Get, "api/mia-chiamata");
requestMessage.SetBrowserResponseStreamingEnabled(false);

In aggiunta alla disabilitazione, si può optare per un effetto globale, andando ad intervenire sul file di progetto o sulle variabili di ambiente

<WasmEnableStreamingResponse>false</WasmEnableStreamingResponse>

DOTNET_WASM_ENABLE_STREAMING_RESPONSE=false

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