Panoramica di .NET in App contenitore di Azure

Per distribuire un'applicazione .NET in un ambiente nativo del cloud come App contenitore di Azure, è necessario prendere decisioni volte a garantire che l'applicazione venga eseguita in modo corretto e sicuro. Questa guida illustra i concetti chiave relativi alla distribuzione di un'applicazione .NET in App contenitore di Azure.

App contenitore di Azure è un servizio contenitore serverless completamente gestito che consente di eseguire applicazioni in contenitori senza dover gestire l'infrastruttura sottostante. App contenitore include supporto predefinito per numerose funzionalità, tra cui scalabilità automatica, controlli di integrità e certificati TLS (Transport Layer Security).

Questo articolo illustra in dettaglio i concetti e le considerazioni fondamentali per la distribuzione di un'applicazione .NET in App contenitore di Azure.

Selezionare un tipo di risorsa

App contenitore supporta due tipi di risorse: app e processi. Le app eseguono continuamente servizi, mentre i processi sono attività di breve durata progettate per l'esecuzione fino a completamento.

Quando ci si prepara per la distribuzione della propria app, prendere in considerazione le differenze tra questi due tipi di applicazione, poiché il loro comportamento influisce sulla modalità di gestione dell'applicazione .NET. La tabella seguente descrive la differenza tra casi d'uso di app e processi.

Caso d'uso Tipo di risorsa
Un'API Web ASP.NET Core che gestisce le richieste HTTP App
Un'applicazione console .NET Core che elabora alcuni dati, quindi si chiude Posizione
Servizio in background in continua esecuzione che elabora messaggi da una coda App
Servizio di ottimizzazione di immagini eseguito solo quando immagini di grandi dimensioni vengono salvate in un account di archiviazione. Posizione
Un'applicazione che usa un framework come Hangfire, Quartz.NET o Azure WebJobs SDK App

Containerizzare e distribuire l'applicazione .NET

Sia per app che per processi, è necessario compilare un'immagine del contenitore per creare un pacchetto dell'applicazione .NET. Per altre informazioni sulla creazione di un'immagine del contenitore, vedere Immagini Docker per ASP.NET Core.

Al termine della configurazione, è possibile distribuire l'applicazione in App contenitore di Azure seguendo queste guide:

Usare l'ingresso HTTP

App contenitore di Azure include un ingresso HTTP predefinito che consente di esporre le app al traffico proveniente dall'esterno del contenitore. L'ingresso di App contenitore si trova tra l'app e l'utente finale. Poiché l'ingresso funge da intermediario, tutto ciò che l'utente finale vede termina all'ingresso e tutto ciò che l'app visualizza inizia all'ingresso.

L'ingresso gestisce la terminazione TLS e i domini personalizzati, eliminando la necessità di configurarli manualmente nell'app. Tramite l'ingresso, la porta 443 viene esposta al traffico HTTPS e, facoltativamente, la porta 80 al traffico HTTP. L'ingresso inoltra le richieste all'app nella porta di destinazione.

Se l'app necessita di metadati relativi alla richiesta originale, può usare intestazioni X-forwarded.

Per altre informazioni, vedere Ingresso HTTP in App contenitore di Azure.

Definire una porta di destinazione

Per ricevere traffico, l'ingresso viene configurato su una porta di destinazione su cui l'app è in ascolto per il traffico.

Quando ASP.NET Core è in esecuzione in un contenitore, l'applicazione rimane in ascolto delle porte configurate nell'immagine del contenitore. Quando si usano le immagini ufficiali ASP.NET Core, l'app è configurata per l'ascolto del traffico HTTP su una porta predefinita. La porta predefinita dipende dalla versione di ASP.NET Core.

esecuzione Porta di destinazione
ASP.NET Core 7 e versioni precedenti 80
ASP.NET Core 8 e versioni successive 8080

Quando si configura l'ingresso, impostare la porta di destinazione sul numero corrispondente all'immagine del contenitore in uso.

Definire le intestazioni X-forwarded

Poiché l'ingresso gestisce la richiesta HTTP originale, l'app vede l'ingresso come client. In alcune situazioni, l'app necessita di conoscere l'indirizzo IP del client originale o il protocollo originale (HTTP o HTTPS). È possibile accedere alle informazioni sul protocollo e sull'indirizzo IP tramite l'intestazione X-Forwarded-* della richiesta.

È possibile leggere i valori originali da queste intestazioni accedendo all'oggetto ForwardedHeaders.

builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders =
        ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    options.KnownNetworks.Clear();
    options.KnownProxies.Clear();
});

Per altre informazioni sull'uso delle intestazioni della richiesta, vedere Configurare ASP.NET Core per l'uso di server proxy e servizi di bilanciamento del carico.

Creare applicazioni .NET native del cloud

Spesso, le applicazioni distribuite in App contenitore funzionano meglio quando si basano sui principi nativi del cloud. Le sezioni seguenti illustrano in dettaglio i problemi comuni relativi alle applicazioni native del cloud.

Configurazione dell'applicazione

Quando si distribuisce l'applicazione .NET in App contenitore di Azure, usare le variabili di ambiente per archiviare le informazioni di configurazione anziché usare appsettings.json. Questa procedura consente di configurare l'applicazione in modi diversi in ambienti differenti. Inoltre, l'uso di variabili di ambiente permette di gestire i valori di configurazione più facilmente senza dover ricompilare e ridistribuire l'immagine del contenitore.

In App contenitore di Azure si impostano le variabili di ambiente quando si definisce il contenitore dell'app o del processo. Archiviare valori sensibili nei segreti e farvi riferimento come variabili di ambiente. Per altre informazioni sulla gestione dei segreti, vedere Gestire segreti in App contenitore di Azure.

Identità gestita

App contenitore di Azure supporta l'identità gestita, che consente all'app di accedere ad altri servizi di Azure senza la necessità di scambiare credenziali. Per altre informazioni sulla comunicazione sicura tra servizi di Azure, vedere Identità gestite in App contenitore di Azure.

Registrazione

In un ambiente nativo del cloud, la registrazione è fondamentale per il monitoraggio e la risoluzione di problemi delle applicazioni. Per impostazione predefinita, App contenitore di Azure usa Azure Log Analytics per raccogliere log dai contenitori. È possibile configurare altri provider di registrazione. Per altre informazioni sulla registrazione delle applicazioni, vedere Opzioni di archiviazione e monitoraggio dei log in App contenitore di Azure.

Quando si configura un provider di registrazione che scrive log nella console, App contenitore di Azure raccoglie e archivia automaticamente i messaggi di log.

Probe di integrità

App contenitore di Azure include il supporto predefinito per i probe di integrità,che consentono di monitorare l'integrità delle applicazioni. Se un probe determina che l'applicazione è in uno stato non integro, il contenitore viene riavviato automaticamente. Per altre informazioni sui probe di integrità, vedere Probe di integrità in App contenitore di Azure.

Per poter implementare una logica personalizzata per determinare l'integrità dell'applicazione, è possibile configurare un endpoint di controllo integrità. Per altre informazioni sugli endpoint di controllo integrità, vedere Controlli di integrità in ASP.NET Core.

Considerazioni sulla scalabilità automatica

Per impostazione predefinita, App contenitore di Azure ridimensiona automaticamente le app ASP.NET Core in base al numero di richieste HTTP in ingresso. È anche possibile configurare regole di scalabilità automatica personalizzate in base ad altre metriche, ad esempio l'utilizzo di CPU o di memoria. Per altre informazioni sul ridimensionamento, vedere Impostare le regole di ridimensionamento in App contenitore di Azure.

In .NET 8.0.4 e versioni successive le app ASP.NET Core che usano la protezione dei dati vengono configurate automaticamente per mantenere i dati protetti accessibili a tutte le repliche man mano che l'applicazione viene ridimensionata. Quando viene avviato il ridimensionamento dell'app, un gestore delle chiavi gestisce la scrittura e la condivisione delle chiavi tra più revisioni. Quando l'app viene distribuita, la variabile di ambiente autoConfigureDataProtection viene impostata automaticamente su true per abilitare questa funzionalità. Per altre informazioni su questa configurazione automatica, vedere questa richiesta pull di GitHub.

La scalabilità automatica modifica il numero di repliche dell'app in base alle regole definite dall'utente. Per impostazione predefinita, App contenitore instrada in modo casuale il traffico in ingresso alle repliche dell'app ASP.NET Core. Poiché il traffico può essere suddiviso tra repliche diverse, l'app deve essere senza stato affinché non riscontri problemi correlati allo stato.

Funzionalità come anti-falsificazione, autenticazione, SignalR, Blazor Server e Razor Pages dipendono dalla protezione dei dati e richiedono ulteriori attività di configurazione per funzionare correttamente durante il ridimensionamento su più repliche.

Configurare la protezione dati

ASP.NET Core include funzionalità speciali per proteggere i dati e rimuoverne la protezione, ad esempio dati di sessione e token anti-falsificazione. Per impostazione predefinita, le chiavi di protezione dei dati vengono archiviate nel file system, scenario non adatto per un ambiente nativo del cloud.

Se si distribuisce un'applicazione .NET Aspire, la protezione dei dati viene configurata automaticamente. In tutte le altre situazioni, è necessario configurare manualmente la protezione dei dati.

Configurare SignalR per ASP.NET Core

SignalR per ASP.NET Core richiede un backplane per distribuire messaggi a più repliche server. Quando si distribuisce l'app ASP.NET Core con SignalR in App contenitore di Azure, è necessario configurare uno dei backplane supportati, ad esempio il servizio Azure SignalR o Redis. Per altre informazioni sui backplane, vedere Hosting e scalabilità di SignalR per ASP.NET Core.

Configurare Blazor Server

Le app Blazor Server ASP.NET Coree archiviano lo stato nel server, di conseguenza ogni client deve essere connesso alla stessa replica del server durante la propria sessione. Quando si distribuisce l'app Blazor Server in App contenitore di Azure, è necessario abilitare lesessioni permanenti per assicurarsi che i client vengano instradati alla stessa replica. Per altre informazioni, vedere Affinità di sessione in App contenitore di Azure.