Implementazioni di server Web in ASP.NET CoreWeb server implementations in ASP.NET Core

Di Tom Dykstra, Steve Smith, Stephen Halter e Chris RossBy Tom Dykstra, Steve Smith, Stephen Halter, and Chris Ross

Un'app ASP.NET Core viene eseguita con un'implementazione del server HTTP in-process.An ASP.NET Core app runs with an in-process HTTP server implementation. L'implementazione del server attende le richieste HTTP e le rende visibili all'app come un set di funzionalità di richiesta combinate in un HttpContext.The server implementation listens for HTTP requests and surfaces them to the app as a set of request features composed into an HttpContext.

KestrelKestrel

Kestrel è il server Web predefinito incluso nei modelli di progetto di ASP.NET Core.Kestrel is the default web server included in ASP.NET Core project templates.

Usare Kestrel:Use Kestrel:

  • Da solo come server perimetrale che elabora le richieste direttamente da una rete, inclusa Internet.By itself as an edge server processing requests directly from a network, including the Internet.

    Kestrel comunica direttamente con Internet senza un server proxy inverso

  • Con un server proxy inverso, ad esempio Internet Information Services (IIS), Nginx o Apache.With a reverse proxy server, such as Internet Information Services (IIS), Nginx, or Apache. Il server proxy inverso riceve le richieste HTTP da Internet e le inoltra a Kestrel.A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel.

    Kestrel comunica indirettamente con Internet attraverso un server proxy inverso, ad esempio IIS, Nginx o Apache

Entrambe le configurazioni di hosting, con o senza un server proxy inverso, sono supportate per le app ASP.NET Core 2.1 o versioni successive.Either hosting configuration—with or without a reverse proxy server—is supported for ASP.NET Core 2.1 or later apps.

Per indicazioni per la configurazione di Kestrel e per informazioni su quando usare Kestrel in una configurazione con proxy inverso, vedere Implementazione del server Web Kestrel in ASP.NET Core.For Kestrel configuration guidance and information on when to use Kestrel in a reverse proxy configuration, see Implementazione del server Web Kestrel in ASP.NET Core.

ASP.NET Core include quanto segue:ASP.NET Core ships with the following:

Quando si usa IIS oppure IIS Express, l'app viene eseguita:When using IIS or IIS Express, the app either runs:

Il modulo ASP.NET Core è un modulo IIS nativo che gestisce le richieste IIS native tra IIS e il server HTTP IIS in-process o il server Kestrel.The ASP.NET Core Module is a native IIS module that handles native IIS requests between IIS and the in-process IIS HTTP Server or Kestrel. Per ulteriori informazioni, vedere Modulo ASP.NET Core.For more information, see Modulo ASP.NET Core.

Modelli di hostingHosting models

Se si usa l'hosting in-process, un'app ASP.NET Core esegue lo stesso processo del processo di lavoro IIS.Using in-process hosting, an ASP.NET Core app runs in the same process as its IIS worker process. L'hosting in-process offre prestazioni migliori rispetto all'hosting out-of-process perché le richieste non vengono inserite in proxy sulla scheda di loopback, un'interfaccia di rete che restituisce il traffico di rete in uscita allo stesso computer.In-process hosting provides improved performance over out-of-process hosting because requests aren't proxied over the loopback adapter, a network interface that returns outgoing network traffic back to the same machine. Per gestire il processo, IIS usa il servizio Attivazione processo Windows (WAS).IIS handles process management with the Windows Process Activation Service (WAS).

Quando si usa l'hosting out-of-process, le app ASP.NET Core vengono eseguite in un processo distinto dal processo di lavoro IIS e il modulo esegue la gestione dei processi.Using out-of-process hosting, ASP.NET Core apps run in a process separate from the IIS worker process, and the module handles process management. Il modulo avvia il processo per l'app ASP.NET Core quando arriva la prima richiesta e riavvia l'app se viene arrestata o si arresta in modo anomalo.The module starts the process for the ASP.NET Core app when the first request arrives and restarts the app if it shuts down or crashes. Si tratta essenzialmente dello stesso comportamento delle app eseguite in-process e gestite dal servizio Attivazione processo Windows.This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

Per altre informazioni e indicazioni per la configurazione, vedere gli argomenti seguenti:For more information and configuration guidance, see the following topics:

ASP.NET Core include quanto segue:ASP.NET Core ships with the following:

Quando si usa IIS o IIS Express, l'app viene eseguita in un processo separato dal processo di lavoro IIS (out-of-process) con il server Kestrel.When using IIS or IIS Express, the app runs in a process separate from the IIS worker process (out-of-process) with the Kestrel server.

Poiché le app ASP.NET Core vengono eseguite in un processo distinto dal processo di lavoro IIS, il modulo esegue la gestione dei processi.Because ASP.NET Core apps run in a process separate from the IIS worker process, the module handles process management. Il modulo avvia il processo per l'app ASP.NET Core quando arriva la prima richiesta e riavvia l'app se viene arrestata o si arresta in modo anomalo.The module starts the process for the ASP.NET Core app when the first request arrives and restarts the app if it shuts down or crashes. Si tratta essenzialmente dello stesso comportamento delle app eseguite in-process e gestite dal servizio Attivazione processo Windows.This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

Il diagramma seguente illustra la relazione tra IIS, il modulo ASP.NET Core e un'app ospitata out-of-process:The following diagram illustrates the relationship between IIS, the ASP.NET Core Module, and an app hosted out-of-process:

Modulo ASP.NET Core

Le richieste arrivano dal Web al driver HTTP.sys in modalità kernel.Requests arrive from the web to the kernel-mode HTTP.sys driver. Il driver instrada le richieste a IIS sulla porta configurata per il sito Web, in genere 80 (HTTP) o 443 (HTTPS).The driver routes the requests to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). Il modulo inoltra le richieste a Kestrel su una porta casuale per l'app non corrispondente alla porta 80 o 443.The module forwards the requests to Kestrel on a random port for the app, which isn't port 80 or 443.

Il modulo specifica la porta tramite una variabile di ambiente all'avvio e il middleware di integrazione IIS configura il server per l'ascolto su http://localhost:{port}.The module specifies the port via an environment variable at startup, and the IIS Integration Middleware configures the server to listen on http://localhost:{port}. Vengono eseguiti controlli aggiuntivi e le richieste che non provengono dal modulo vengono rifiutate.Additional checks are performed, and requests that don't originate from the module are rejected. Il modulo non supporta l'inoltro HTTPS, pertanto le richieste vengono inoltrate tramite HTTP anche se sono state ricevute da IIS tramite HTTPS.The module doesn't support HTTPS forwarding, so requests are forwarded over HTTP even if received by IIS over HTTPS.

Dopo che Kestrel ha prelevato la richiesta dal modulo, viene eseguito il push della richiesta nella pipeline middleware ASP.NET Core.After Kestrel picks up the request from the module, the request is pushed into the ASP.NET Core middleware pipeline. La pipeline middleware gestisce la richiesta e la passa come istanza di HttpContext alla logica dell'app.The middleware pipeline handles the request and passes it on as an HttpContext instance to the app's logic. Il middleware aggiunto dall'integrazione di IIS aggiorna lo schema, l'IP remoto e il percorso di base all'account per l'inoltro della richiesta a Kestrel.Middleware added by IIS Integration updates the scheme, remote IP, and pathbase to account for forwarding the request to Kestrel. La risposta dell'app viene quindi passata a IIS, che ne esegue di nuovo il push al client HTTP che ha avviato la richiesta.The app's response is passed back to IIS, which pushes it back out to the HTTP client that initiated the request.

Per indicazioni sulla configurazione di IIS e del modulo ASP.NET Core, vedere gli argomenti seguenti:For IIS and ASP.NET Core Module configuration guidance, see the following topics:

Nginx con KestrelNginx with Kestrel

Per informazioni su come usare Nginx in Linux come server proxy inverso per Kestrel, vedere Hosting di ASP.NET Core in Linux con Nginx.For information on how to use Nginx on Linux as a reverse proxy server for Kestrel, see Hosting di ASP.NET Core in Linux con Nginx.

Apache con KestrelApache with Kestrel

Per informazioni su come usare Apache in Linux come server proxy inverso per Kestrel, vedere Hosting di ASP.NET Core in Linux con Apache.For information on how to use Apache on Linux as a reverse proxy server for Kestrel, see Hosting di ASP.NET Core in Linux con Apache.

HTTP.sysHTTP.sys

Se si eseguono app ASP.NET Core in Windows, HTTP.sys è un'alternativa a Kestrel.If ASP.NET Core apps are run on Windows, HTTP.sys is an alternative to Kestrel. Kestrel è in genere consigliato per ottenere prestazioni ottimali.Kestrel is generally recommended for best performance. HTTP.sys è utilizzabile negli scenari in cui l'app viene esposta a Internet e le funzionalità necessarie sono supportate da HTTP.sys, ma non da Kestrel.HTTP.sys can be used in scenarios where the app is exposed to the Internet and required capabilities are supported by HTTP.sys but not Kestrel. Per ulteriori informazioni, vedere Implementazione del server Web HTTP.sys in ASP.NET Core.For more information, see Implementazione del server Web HTTP.sys in ASP.NET Core.

HTTP.sys comunica direttamente con Internet

HTTP.sys può essere usato anche per le app che vengono esposte solo a una rete interna.HTTP.sys can also be used for apps that are only exposed to an internal network.

HTTP.sys comunica direttamente con la rete interna

Per indicazioni per la configurazione di HTTP.sys, vedere Implementazione del server Web HTTP.sys in ASP.NET Core.For HTTP.sys configuration guidance, see Implementazione del server Web HTTP.sys in ASP.NET Core.

Infrastruttura del server ASP.NET CoreASP.NET Core server infrastructure

L'oggetto IApplicationBuilder disponibile nel metodo Startup.Configure espone la proprietà ServerFeatures del tipo IFeatureCollection.The IApplicationBuilder available in the Startup.Configure method exposes the ServerFeatures property of type IFeatureCollection. Kestrel e HTTP.sys espongono una singola funzionalità ciascuno, IServerAddressesFeature, ma implementazioni server diverse potrebbero esporre funzionalità aggiuntive.Kestrel and HTTP.sys only expose a single feature each, IServerAddressesFeature, but different server implementations may expose additional functionality.

È possibile usare IServerAddressesFeature per individuare la porta a cui è associata l'implementazione server in fase di esecuzione.IServerAddressesFeature can be used to find out which port the server implementation has bound at runtime.

Server personalizzatiCustom servers

Se i server predefiniti non soddisfano i requisiti dell'app, è possibile creare un'implementazione server personalizzata.If the built-in servers don't meet the app's requirements, a custom server implementation can be created. La guida a Open Web Interface for .NET (OWIN) spiega come scrivere un'implementazione Nowin di IServer.The Open Web Interface for .NET (OWIN) guide demonstrates how to write a Nowin-based IServer implementation. È necessario implementare solo le interfacce delle funzionalità usate dall'app, anche se è richiesto come minimo il supporto di IHttpRequestFeature e IHttpResponseFeature.Only the feature interfaces that the app uses require implementation, though at a minimum IHttpRequestFeature and IHttpResponseFeature must be supported.

Avvio del serverServer startup

Il server viene avviato quando l'editor o l'ambiente di sviluppo integrato (IDE) avvia l'app:The server is launched when the Integrated Development Environment (IDE) or editor starts the app:

All'avvio dell'app dal prompt dei comandi nella cartella del progetto, dotnet run avvia l'app e il server (solo Kestrel e HTTP.sys).When launching the app from a command prompt in the project's folder, dotnet run launches the app and server (Kestrel and HTTP.sys only). La configurazione viene specificata dall'opzione -c|--configuration, impostata su Debug (valore predefinito) o su Release.The configuration is specified by the -c|--configuration option, which is set to either Debug (default) or Release. Se sono presenti profili di avvio in un file launchSettings.json, usare l'opzione --launch-profile <NAME> per impostare il profilo di avvio (ad esempio, Development o Production).If launch profiles are present in a launchSettings.json file, use the --launch-profile <NAME> option to set the launch profile (for example, Development or Production). Per altre informazioni, vedere dotnet run e Creazione di pacchetti di distribuzione di .NET Core.For more information, see dotnet run and .NET Core distribution packaging.

Supporto per HTTP/2HTTP/2 support

HTTP/2 è supportato con ASP.NET Core negli scenari di distribuzione seguenti:HTTP/2 is supported with ASP.NET Core in the following deployment scenarios:

  • KestrelKestrel
    • Sistema operativoOperating system
      • Windows Server 2016/Windows 10 o versioni successive†Windows Server 2016/Windows 10 or later†
      • Linux con OpenSSL 1.0.2 o versioni successive (ad esempio, Ubuntu 16.04 o versioni successive)Linux with OpenSSL 1.0.2 or later (for example, Ubuntu 16.04 or later)
      • HTTP/2 verrà supportato in macOS in una versione futura.HTTP/2 will be supported on macOS in a future release.
    • Framework di destinazione: .NET Core 2.2 o versioni successiveTarget framework: .NET Core 2.2 or later
  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 o versioni successiveWindows Server 2016/Windows 10 or later
    • Framework di destinazione: non applicabile alle distribuzioni HTTP.sys.Target framework: Not applicable to HTTP.sys deployments.
  • IIS (in-process)IIS (in-process)
    • Windows Server 2016/Windows 10 o versioni successive; IIS 10 o versioni successiveWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Framework di destinazione: .NET Core 2.2 o versioni successiveTarget framework: .NET Core 2.2 or later
  • IIS (out-of-process)IIS (out-of-process)
    • Windows Server 2016/Windows 10 o versioni successive; IIS 10 o versioni successiveWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Le connessioni server perimetrali pubbliche usano HTTP/2, mentre la connessione con proxy inverso a Kestrel usa HTTP/1.1.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • Framework di destinazione: non applicabile alle distribuzioni IIS out-of-process.Target framework: Not applicable to IIS out-of-process deployments.

†Kestrel ha un supporto limitato per HTTP/2 in Windows Server 2012 R2 e Windows 8.1.†Kestrel has limited support for HTTP/2 on Windows Server 2012 R2 and Windows 8.1. Il supporto è limitato perché l'elenco di suite di crittografia TLS supportate disponibili in questi sistemi operativi è limitato.Support is limited because the list of supported TLS cipher suites available on these operating systems is limited. Un certificato generato con un algoritmo ECDSA potrebbe essere necessario per proteggere le connessioni TLS.A certificate generated using an Elliptic Curve Digital Signature Algorithm (ECDSA) may be required to secure TLS connections.

  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 o versioni successiveWindows Server 2016/Windows 10 or later
    • Framework di destinazione: non applicabile alle distribuzioni HTTP.sys.Target framework: Not applicable to HTTP.sys deployments.
  • IIS (out-of-process)IIS (out-of-process)
    • Windows Server 2016/Windows 10 o versioni successive; IIS 10 o versioni successiveWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Le connessioni server perimetrali pubbliche usano HTTP/2, mentre la connessione con proxy inverso a Kestrel usa HTTP/1.1.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • Framework di destinazione: non applicabile alle distribuzioni IIS out-of-process.Target framework: Not applicable to IIS out-of-process deployments.

Una connessione HTTP/2 deve usare ALPN (Application-Layer Protocol Negotiation) e TLS 1.2 o versioni successive.An HTTP/2 connection must use Application-Layer Protocol Negotiation (ALPN) and TLS 1.2 or later. Per altre informazioni, vedere gli argomenti relativi agli scenari di distribuzione server.For more information, see the topics that pertain to your server deployment scenarios.

Risorse aggiuntiveAdditional resources