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
Gestire dati sensibili nella configurazione in ASP.NET Core
Gestire i file esterni in una PWA
Leggere e scrivere su cookie tramite Blazor
Usare Azure Application Gateway come reverse proxy per ASP.NET Core
Specificare il numero di parentesi graffe nella string interpolation in combinazione con i string literal in C#
Creare attributi generici in C#
Utilizzare l'API del browser fetch
Definire le impostazioni di cache a livello di controller in ASP.NET Core 7
Health monitoring con Azure Container App
Gestire la query string nell'output cache di ASP.NET Core
Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
Creare una timeline da una pipeline di Azure DevOps
I più letti di oggi
- Sfruttare la local cache del browser tramite gli ETag in #aspnetcore https://aspit.co/cfc di @crad77 #webapi #aspnetmvc #blazor #cache
- Costruire un guestbook con XML e XSL
- Container & DevOps Day - Online
- Windows Azure in versione 1.0: annunciata la piattaforma Microsoft per il cloud computing
- Sfruttare la local cache del browser tramite gli ETag in ASP.NET Core
- Gestione delle finestre modali in HTML5 con Bootstrap