Implémentations de serveurs web dans ASP.NET CoreWeb server implementations in ASP.NET Core

De Tom Dykstra, Steve Smith, Stephen Halter et Chris RossBy Tom Dykstra, Steve Smith, Stephen Halter, and Chris Ross

Une application ASP.NET Core s’exécute avec une implémentation de serveur HTTP in-process.An ASP.NET Core app runs with an in-process HTTP server implementation. L’implémentation du serveur écoute les requêtes HTTP et les expose à l’application sous forme d’ensemble de fonctionnalités de requêtes composées dans 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 est le serveur web par défaut inclus dans les modèles de projet ASP.NET Core.Kestrel is the default web server included in ASP.NET Core project templates.

Utilisez Kestrel :Use Kestrel:

  • Par lui même, c’est-à-dire en tant que serveur de périphérie traitant les requêtes en provenance directe d’un réseau, notamment d’Internet.By itself as an edge server processing requests directly from a network, including the Internet.

    Kestrel communique directement avec Internet sans serveur proxy inverse

  • Avec un serveur proxy inverse, comme IIS (Internet Information Services), Nginx ou Apache.With a reverse proxy server, such as Internet Information Services (IIS), Nginx, or Apache. Un serveur proxy inverse reçoit les requêtes HTTP en provenance d’Internet et les transmet à Kestrel.A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel.

    Kestrel communique indirectement avec Internet via un serveur proxy inverse, par exemple IIS, Nginx ou Apache

Les deux configurations d’hébergement, —avec ou sans serveur proxy inverse—, sont prises en charge pour les applications ASP.NET Core 2.1 ou des versions ultérieures.Either hosting configuration—with or without a reverse proxy server—is supported for ASP.NET Core 2.1 or later apps.

Pour des conseils de configuration de Kestrel et des informations sur le moment d’utiliser Kestrel dans une configuration de proxy inverse, consultez Implémentation du serveur web Kestrel dans ASP.NET Core.For Kestrel configuration guidance and information on when to use Kestrel in a reverse proxy configuration, see Implémentation du serveur web Kestrel dans ASP.NET Core.

ASP.NET Core est fourni avec les composants suivants :ASP.NET Core ships with the following:

Lorsque vous utilisez IIS ou IIS Express, l’application s’exécute :When using IIS or IIS Express, the app either runs:

Le module ASP.NET Core est un module IIS natif qui gère les requêtes IIS natives entre IIS et le serveur HTTP IIS in-process ou 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. Pour plus d’informations, consultez Module ASP.NET Core.For more information, see Module ASP.NET Core.

Modèles d'hébergementHosting models

En utilisant l’hébergement in-process, une application ASP.NET Core s’exécute dans le même processus que son processus de travail IIS.Using in-process hosting, an ASP.NET Core app runs in the same process as its IIS worker process. L’hébergement in-process offre de meilleures performances que l’hébergement out-of-process parce que les requêtes n’ont pas de proxy sur l’adaptateur de bouclage, interface réseau qui retourne du trafic réseau sortant à la même machine.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. IIS s’occupe de la gestion des processus par l’intermédiaire du service d’activation des processus Windows (WAS).IIS handles process management with the Windows Process Activation Service (WAS).

Avec l’hébergement out-of-process, les applications ASP.NET Core s’exécutent dans un processus distinct du processus de travail IIS, et le module s’occupe de la gestion de processus.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. Le module démarre le processus pour l’application ASP.NET Core quand la première requête arrive, et il redémarre l’application si elle s’arrête ou se bloque.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. Il s’agit essentiellement du même comportement que celui des applications s’exécutant in-process, et qui sont gérées par le service d’activation des processus Windows (WAS).This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

Pour plus d’informations et pour obtenir de l’aide sur la configuration, consultez les rubriques suivantes :For more information and configuration guidance, see the following topics:

ASP.NET Core est fourni avec les composants suivants :ASP.NET Core ships with the following:

Lorsqu’IIS ou IIS Express sont utilisés, l’application s’exécute dans un processus séparé du processus Worker IIS (le mode d’hébergement out-of-process) avec le serveur 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.

Étant donné que les applications ASP.NET Core s’exécutent dans un processus distinct du processus de travail IIS, le module s’occupe de la gestion du processus.Because ASP.NET Core apps run in a process separate from the IIS worker process, the module handles process management. Le module démarre le processus pour l’application ASP.NET Core quand la première requête arrive, et il redémarre l’application si elle s’arrête ou se bloque.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. Il s’agit essentiellement du même comportement que celui des applications s’exécutant in-process, et qui sont gérées par le service d’activation des processus Windows (WAS).This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

Le schéma suivant illustre la relation entre IIS, le module ASP.NET Core et une application hébergée hors processus :The following diagram illustrates the relationship between IIS, the ASP.NET Core Module, and an app hosted out-of-process:

Module ASP.NET Core

Les requêtes arrivent du web au pilote HTTP.sys en mode noyau.Requests arrive from the web to the kernel-mode HTTP.sys driver. Le pilote route les requêtes vers IIS sur le port configuré du site web, généralement 80 (HTTP) ou 443 (HTTPS).The driver routes the requests to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). Le module transfère les requêtes à Kestrel sur un port aléatoire pour l’application, qui n’est ni le port 80 ni le port 443.The module forwards the requests to Kestrel on a random port for the app, which isn't port 80 or 443.

Le module spécifie le port via une variable d’environnement au démarrage, et le middleware d’intégration IIS configure le serveur pour qu’il écoute sur 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}. Des vérifications supplémentaires sont effectuées, et les requêtes qui ne proviennent pas du module sont rejetées.Additional checks are performed, and requests that don't originate from the module are rejected. Le module ne prend pas en charge le transfert HTTPS : les requêtes sont donc transférées via HTTP, même si IIS les reçoit via HTTPS.The module doesn't support HTTPS forwarding, so requests are forwarded over HTTP even if received by IIS over HTTPS.

Dès que Kestrel sélectionne la requête dans le module, celle-ci est envoyée (push) dans le pipeline de middlewares d’ASP.NET Core.After Kestrel picks up the request from the module, the request is pushed into the ASP.NET Core middleware pipeline. Le pipeline de middlewares traite la requête et la passe en tant qu’instance de HttpContext à la logique de l’application.The middleware pipeline handles the request and passes it on as an HttpContext instance to the app's logic. Le middleware ajouté par l’intégration d’IIS met à jour le schéma, l’adresse IP distante et la base du chemin pour prendre en compte le transfert de la requête à Kestrel.Middleware added by IIS Integration updates the scheme, remote IP, and pathbase to account for forwarding the request to Kestrel. La réponse de l’application est ensuite repassée à IIS, qui la renvoie au client HTTP à l’origine de la requête.The app's response is passed back to IIS, which pushes it back out to the HTTP client that initiated the request.

Pour des conseils de configuration d’IIS et du module ASP.NET Core, consultez les rubriques suivantes :For IIS and ASP.NET Core Module configuration guidance, see the following topics:

Nginx avec KestrelNginx with Kestrel

Pour plus d’informations sur l’utilisation de Nginx sur Linux comme serveur proxy inverse pour Kestrel, consultez Héberger ASP.NET Core sur Linux avec Nginx.For information on how to use Nginx on Linux as a reverse proxy server for Kestrel, see Héberger ASP.NET Core sur Linux avec Nginx.

Apache avec KestrelApache with Kestrel

Pour plus d’informations sur l’utilisation d’Apache sur Linux comme serveur proxy inverse pour Kestrel, consultez Héberger ASP.NET Core sur Linux avec Apache.For information on how to use Apache on Linux as a reverse proxy server for Kestrel, see Héberger ASP.NET Core sur Linux avec Apache.

HTTP.sysHTTP.sys

Si vos applications ASP.NET Core sont exécutées sur Windows, HTTP.sys est une alternative à Kestrel.If ASP.NET Core apps are run on Windows, HTTP.sys is an alternative to Kestrel. Kestrel est généralement recommandé pour de meilleures performances.Kestrel is generally recommended for best performance. HTTP.sys peut être utilisé dans les scénarios où l’application est exposée à Internet et où des fonctionnalités requises sont prises en charge par HTTP.sys, mais pas par 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. Pour plus d’informations, consultez Implémentation du serveur web HTTP.sys dans ASP.NET Core.For more information, see Implémentation du serveur web HTTP.sys dans ASP.NET Core.

HTTP.sys communique directement avec Internet

HTTP.sys peut également être utilisé pour les applications qui sont exposées seulement à un réseau interne.HTTP.sys can also be used for apps that are only exposed to an internal network.

HTTP.sys communique directement avec le réseau interne

Pour obtenir des conseils de configuration de HTTP.sys, consultez Implémentation du serveur web HTTP.sys dans ASP.NET Core.For HTTP.sys configuration guidance, see Implémentation du serveur web HTTP.sys dans ASP.NET Core.

Infrastructure serveur d’ASP.NET CoreASP.NET Core server infrastructure

Le IApplicationBuilder disponible dans la méthode Startup.Configure expose la propriété ServerFeatures du type IFeatureCollection.The IApplicationBuilder available in the Startup.Configure method exposes the ServerFeatures property of type IFeatureCollection. Kestrel et HTTP.sys exposent une seule fonctionnalité chacun, IServerAddressesFeature, mais des implémentations serveur différentes peuvent exposer des fonctionnalités supplémentaires.Kestrel and HTTP.sys only expose a single feature each, IServerAddressesFeature, but different server implementations may expose additional functionality.

IServerAddressesFeature permet de déterminer quel est le port lié à l’implémentation serveur au moment de l’exécution.IServerAddressesFeature can be used to find out which port the server implementation has bound at runtime.

Serveurs personnalisésCustom servers

Si les serveurs intégrés ne répondent pas aux spécifications de l’application, vous pouvez créer une implémentation serveur personnalisée.If the built-in servers don't meet the app's requirements, a custom server implementation can be created. Le guide OWIN (Open Web Interface pour .NET) montre comment écrire une implémentation IServer basée sur Nowin.The Open Web Interface for .NET (OWIN) guide demonstrates how to write a Nowin-based IServer implementation. Seules les interfaces des fonctionnalités utilisées par l’application nécessitent une implémentation, bien qu’au minimum IHttpRequestFeature et IHttpResponseFeature doivent être pris en charge.Only the feature interfaces that the app uses require implementation, though at a minimum IHttpRequestFeature and IHttpResponseFeature must be supported.

Démarrage du serveurServer startup

Le serveur est lancé lorsque l’environnement de développement intégré (IDE) ou l’éditeur démarre l’application :The server is launched when the Integrated Development Environment (IDE) or editor starts the app:

Lors du lancement de l’application à partir d’une invite de commandes dans le dossier du projet, dotnet run lance l’application et le serveur (Kestrel et HTTP.sys uniquement).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 configuration est spécifiée par l’option -c|--configuration, qui est définie sur Debug (par défaut) ou sur Release.The configuration is specified by the -c|--configuration option, which is set to either Debug (default) or Release. Si les profils de lancement sont présents dans un fichier launchSettings.json, utilisez l’option --launch-profile <NAME> pour définir le profil de lancement (par exemple Development ou 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). Pour plus d’informations, consultez les rubriques dotnet run et Package de distribution de .NET Core.For more information, see dotnet run and .NET Core distribution packaging.

Prise en charge de HTTP/2HTTP/2 support

HTTP/2 est pris en charge avec ASP.NET Core dans les scénarios de déploiement suivants :HTTP/2 is supported with ASP.NET Core in the following deployment scenarios:

  • KestrelKestrel
    • Système d'exploitationOperating system
      • Windows Server 2016/Windows 10 ou version ultérieure†Windows Server 2016/Windows 10 or later†
      • Linux avec OpenSSL 1.0.2 ou version ultérieure (par exemple, Ubuntu 16.04 ou version ultérieure)Linux with OpenSSL 1.0.2 or later (for example, Ubuntu 16.04 or later)
      • HTTP/2 sera pris en charge sur macOS dans une prochaine version.HTTP/2 will be supported on macOS in a future release.
    • Version cible de .Net Framework : .NET Core 2.2 ou version ultérieureTarget framework: .NET Core 2.2 or later
  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 ou version ultérieureWindows Server 2016/Windows 10 or later
    • Version cible de .NET Framework : non applicable aux déploiements HTTP.sys.Target framework: Not applicable to HTTP.sys deployments.
  • IIS (in-process)IIS (in-process)
    • Windows Server 2016/Windows 10 ou version ultérieure ; IIS 10 ou version ultérieureWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Version cible de .Net Framework : .NET Core 2.2 ou version ultérieureTarget framework: .NET Core 2.2 or later
  • IIS (out-of-process)IIS (out-of-process)
    • Windows Server 2016/Windows 10 ou version ultérieure ; IIS 10 ou version ultérieureWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Les connexions au serveur périphérique public utilisent HTTP/2, mais la connexion de proxy inverse à Kestrel utilise HTTP/1.1.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • Version cible de .NET Framework : non applicable aux déploiements IIS out-of-process.Target framework: Not applicable to IIS out-of-process deployments.

†Kestrel propose une prise en charge limitée de HTTP/2 sous Windows Server 2012 R2 et Windows 8.1.†Kestrel has limited support for HTTP/2 on Windows Server 2012 R2 and Windows 8.1. La prise en charge est limitée car la liste des suites de chiffrement TLS prises en charge sur ces systèmes d’exploitation est limitée.Support is limited because the list of supported TLS cipher suites available on these operating systems is limited. Un certificat généré à l’aide d’Elliptic Curve Digital Signature algorithme (ECDSA) peut être requis pour sécuriser les connexions 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 ou version ultérieureWindows Server 2016/Windows 10 or later
    • Version cible de .NET Framework : non applicable aux déploiements HTTP.sys.Target framework: Not applicable to HTTP.sys deployments.
  • IIS (out-of-process)IIS (out-of-process)
    • Windows Server 2016/Windows 10 ou version ultérieure ; IIS 10 ou version ultérieureWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Les connexions au serveur périphérique public utilisent HTTP/2, mais la connexion de proxy inverse à Kestrel utilise HTTP/1.1.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • Version cible de .NET Framework : non applicable aux déploiements IIS out-of-process.Target framework: Not applicable to IIS out-of-process deployments.

Une connexion HTTP/2 doit utiliser la négociation du protocole de la couche d’application (ALPN) et TLS 1.2 ou version ultérieure.An HTTP/2 connection must use Application-Layer Protocol Negotiation (ALPN) and TLS 1.2 or later. Pour plus d’informations, consultez les rubriques qui se rapportent à vos scénarios de déploiement de serveur.For more information, see the topics that pertain to your server deployment scenarios.

Ressources supplémentairesAdditional resources