Ospitare le applicazioni ASP.NET Core 2.2 su Windows Server o Microsoft Azure diventa ancora più efficiente grazie alla nuova modalità di hosting InProcess.
In modalità InProcess, l'applicazione viene eseguita all'interno del processo w3wp.exe di IIS o, nel caso di IIS Express, in iisexpress.exe. In questo modo, IIS non deve più agire da reverse proxy inoltrando le richieste HTTP a Kestrel attraverso l'interfaccia di loopback. Con la modalità InProcess, infatti, Kestrel viene del tutto rimpiazzato da un'altra implementazione fornita dall'ASP.NET Core Module che si chiama IIS HTTP Server.
Il miglioramento prestazionale è tangibile: il throughput dichiarato da Microsoft, ovvero la capacità dell'applicazione di ingerire richieste, risulta pressoché quadruplicata.
Le misurazioni sono state fatte su un'applicazione minimale. In un'applicazione reale, invece, i tempi di esecuzione saranno ancora determinati in maniera preponderante dal codice applicativo che abbiamo scritto. È comunque interessante sapere che lo stack tecnologico continua a essere migliorato per fornirci prestazioni sempre migliori, apprezzabili soprattutto quando sono più necessarie, cioè con molti utenti contemporanei.
Abilitare la modalità di hosting InProcess nel progetto
Per prima cosa, migriamo la nostra applicazione alla versione 2.2 di ASP.NET Core come indicato nel precedente script (https://www.aspitalia.com/script/1314/Migrare-Application-ASP.NET-Core-2.1-Versione-2.2.aspx). Poi apriamo il file .csproj dell'applicazione e aggiungiamo l'opzione<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
nel primo PropertyGroup. Questa opzione sarà già presente di default se creiamo una nuova applicazione ASP.NET Core 2.2.
Questa impostazione avrà effetto durante la pubblicazione dell'applicazione, che eseguiamo con il comando dotnet publish. Il file web.config che troveremo nella directory di pubblicazione conterrà l'attributo hostingModel="InProcess" sull'elemento aspNetCore.
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\MiaApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" /> </system.webServer> </location> </configuration>
Preparare il server per la modalità di hosting InProcess
Per fruttare la modalità di hosting InProcess su macchine Windows Server, dobbiamo aggiornare l'ASP.NET Core Module installando .NET Core Hosting Bundle ottenibile dal seguente link: https://www.microsoft.com/net/permalink/dotnetcore-current-windows-runtime-bundle-installerIl bundle, oltre all'ASP.NET Core module, contiene anche la versione più aggiornata di .NET Core Runtime.
A installazione avvenuta, possiamo verificare che l'applicazione stia effettivamente funzionando con la modalità di hosting InProcess osservando il Task Manager. Se tutto è stato configurato correttamente, vedremo solo il processo w3wp.exe e non anche dotnet.exe.
Se desideriamo tornare alla modalità predefinita, possiamo rimuovere l'attributo hostingModel dal nodo aspNetCore del web.config oppure impostarlo sul valore OutOfProcess. IIS riavvierà l'applicazione e, in questo caso, torneremo a osservare sia il processo w3wp.exe che dotnet.exe, entrambi eseguiti con l'identità che abbiamo assegnato all'application pool.
Un altro modo che abbiamo per verificare di aver fatto tutto correttamente è visualizzare il nome del processo in cui l'applicazione viene eseguita. Nell'esempio seguente lo stampiamo in console all'avvio dell'applicazione, dal metodo Main della classe Program.
public static void Main(string[] args) { Console.WriteLine($"Nome processo: {Process.GetCurrentProcess().ProcessName}"); CreateWebHostBuilder(args).Build().Run(); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Configurare dependabot per aggiornare le dipendenze di terze parti con GitHub Actions
Eseguire query verso tipi non mappati in Entity Framework Core
Eseguire operazioni con timeout in React
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Configurare policy CORS in Azure Container Apps
Eseguire una query su SQL Azure tramite un workflow di GitHub
Hosting di componenti WebAssembly in un'applicazione Blazor static
Gestire liste di tipi semplici con Entity Framework Core
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Utilizzare gli snapshot con Azure File shares
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
I più letti di oggi
- Utilizzare Docker Compose con Azure App Service
- Utilizzare QuickGrid di Blazor con Entity Framework
- Modernizzare le applicazioni WPF e Windows Forms con Blazor
- ASP 3 per esempi
- annunciato #netstandard 2.1. .NET Core lo supporterà a partire da #netcore3, così come le prossime versione di #xamarin, #mono e #unity.il supporto per #netfx 4.8, invece, non ci sarà. https://aspit.co/bq2