Migliorare le performance di ASP.NET Core 2.2 su IIS

di Moreno Gentili, in ASP.NET Core,

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-installer

Il 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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi