ASP.NET Core è stato progettato con un'architettura che ha moltissimi punti di estendibilità, a partire dal webserver stesso che può essere configurato o del tutto sostituito da altre implementazioni.
Di default, un'applicazione ASP.NET Core usa il webserver Kestrel, fornito con .NET Core. Questo webserver è open-source e in grado di funzionare ugualmente bene su Windows, Mac e Linux. Kestrel è un webserver estremamente performante ma la sua implementazione è ancora giovane e non possiede tutte le funzionalità o la robustezza di altri webserver più maturi. Microsoft raccomanda di non esporre Kestrel direttamente su internet ma di proteggerlo alle spalle di un altro webserver che agirà da reverse proxy, il cui scopo è quello di ricevere e filtrare le richieste dai client per poi inoltrarle a Kestrel, fornendo anche funzionalità aggiuntive in questo processo.

In alternativa, possiamo sfruttare HTTP.sys (noto come WebListener in ASP.NET Core 1.x), un server ricco di funzionalità e più maturo rispetto a Kestrel. Infatti, è in uso da molti anni sia su Windows che su Windows Server come componente fondamentale di IIS.
HTTP.sys si interfaccia con l'omonimo driver di Windows attraverso le [I]HTTP Server API e perciò, al contrario di Kestrel, non può funzionare sulle altre piattaforme supportate da .NET Core.
Data la sua comprovata robustezza, può essere esposto su internet senza la necessità di configurare un reverse proxy.

Sia Kestrel che HTTP.sys hanno i loro pregi e ambiti di utilizzo. Saper scegliere ci permetterà di creare un'applicazione ASP.NET Core che risponde più precisamente alle esigenze dei nostri committenti.
Vediamo in questa tabella riepilogativa quali sono le principali differenze tra i due webserver.

Per usare Kestrel con le sue impostazioni di default non dobbiamo apportare alcuna modifica al codice dell'applicazione. Tuttavia, se abbiamo bisogno di configurare le opzioni di Kestrel come in questo precedente script (https://www.aspitalia.com/script/1277/Impostare-Dimensione-Massima-Request-ASP.NET-Core.aspx), allora dovremo invocare esplicitamente l'extension method UseKestrel durante la costruzione del web host, che avviene nella classe Program del progetto.
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { //Qui usiamo l'oggetto options per configurare Kestrel }) .UseLibuv(options => { //Qui usiamo l'oggetto options per configurare Libuv }) .UseStartup<Startup>() .Build();
Il precedente esempio mostra anche l'extension method UseLibuv, che permette di configurare Libuv, una libreria di supporto usata da Kestrel operante a livello di trasporto. In altre parole, si occupa di gestire le operazioni di I/O con i client in maniera asincrona. Anche Libuv è open-source e multipiattaforma.
Quando invece preferiamo usare HTTP.sys, possiamo configurarlo usando l'extension method UseHttpSys.
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseHttpSys(options => { //Qui usiamo l'oggetto options per configurare HTTP.sys }) .UseStartup<Startup>() .Build();
ASP.NET Core non è limitato ai due webserver che abbiamo appena visto. Infatti, ASP.NET Core può lavorare con una qualsiasi implementazione dell'interfaccia IServer, che possiamo registrare con l'extension method UseServer. Costruire un web server non è un compito semplice, per via delle tematiche riguardanti la sicurezza delle applicazioni web. Tuttavia, non è escluso che in futuro si presentino nuove implementazioni di terze parti che offrono nuove peculiarità. Questo è uno dei grandi vantaggi di usare un framework estendibile e open-source come ASP.NET Core.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare parametri a livello di controller nel routing di ASP.NET Core
Recuperare la data di creazione e ultima modifica di un record con Entity Framework Core e le temporal table di SQL Server
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Azure Functions e OpenAPI: la coppia perfetta!
Caricare un asset come parte di una release con un workflow di GitHub
Determinare lo stato di un pod in Kubernetes
3 metodi JavaScript che ogni applicazione web dovrebbe contenere
Linting di un Dockerfile con un workflow di GitHub
Definire una tabella come memory optimized su Sql Server tramite EF Core
3 metodi JavaScript che ogni applicazione web dovrebbe contenere - Parte 2
Montare blob e file share su Azure App Service
Sfruttare il portale Azure per creare script di automazione
I più letti di oggi
- devConf 2022 - Online
- .NET Conference Italia 2022 - Milano e Online
- Visual Studio 2019 Live - Milano
- Real Code Day 4.0: costruire applicazioni reali - Firenze
- Real Code Conference 4.0 - Firenze
- Global Azure Milan 2020 - Online
- Blazor Conference 2020 Live - Online
- PWAConf 2020 - Online
- Visual Studio 2015 Preview Live - Online
- Blazor Conference 2021 - Online