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
Usare le navigation property in QuickGrid di Blazor
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Proteggere le risorse Azure con private link e private endpoints
Migliorare l'organizzazione delle risorse con Azure Policy
Applicare un filtro per recuperare alcune issue di GitHub
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Aggiungere interattività lato server in Blazor 8
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Utilizzare Tailwind CSS all'interno di React: installazione