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
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Usare un KeyedService di default in ASP.NET Core 8
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Routing statico e PreRendering in una Blazor Web App
Effettuare il refresh dei dati di una QuickGrid di Blazor
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Assegnare un valore di default a un parametro di una lambda in C#
Utilizzare il trigger SQL con le Azure Function
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Miglioramenti nell'accessibilità con Angular CDK
Usare lo spread operator con i collection initializer in C#