Implementações de servidor Web em ASP.NET CoreWeb server implementations in ASP.NET Core

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

Um aplicativo ASP.NET Core é executado com uma implementação do servidor HTTP em processo.An ASP.NET Core app runs with an in-process HTTP server implementation. A implementação do servidor escuta solicitações HTTP e apresenta-as para o aplicativo como um conjunto de recursos de solicitação compostos em um HttpContext.The server implementation listens for HTTP requests and surfaces them to the app as a set of request features composed into an HttpContext.

O ASP.NET Core vem com os seguintes itens:ASP.NET Core ships with the following:

Ao usar o IIS ou o IIS Express, o aplicativo é executado:When using IIS or IIS Express, the app either runs:

O módulo do ASP.NET Core é um módulo nativo do IIS que manipula as solicitações nativas do IIS entre o IIS e o servidor HTTP do IIS em processo ou o 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. Para obter mais informações, consulte Módulo do ASP.NET Core.For more information, see Módulo do ASP.NET Core.

Modelos de hospedagemHosting models

Modelo de hospedagem em processoIn-process hosting model

Usando uma hospedagem em processo, um aplicativo ASP.NET Core é executado no mesmo processo que seu processo de trabalho do IIS.Using in-process hosting, an ASP.NET Core app runs in the same process as its IIS worker process. A hospedagem em processo oferece desempenho melhor em hospedagem fora do processo porque as solicitações não são transmitidas por proxy pelo adaptador de loopback, um adaptador de rede que retorna o tráfego de rede de saída para o mesmo computador.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. O IIS manipula o gerenciamento de processos com o WAS (Serviço de Ativação de Processos do Windows).IIS handles process management with the Windows Process Activation Service (WAS).

O Módulo do ASP.NET Core:The ASP.NET Core Module:

  • Executa a inicialização do aplicativo.Performs app initialization.
    • Carrega o CoreCLR.Loads the CoreCLR.
    • Chama Program.Main.Calls Program.Main.
  • Manipula o tempo de vida da solicitação nativa do IIS.Handles the lifetime of the IIS native request.

Não há suporte para o modelo de hospedagem em processo para aplicativos ASP.NET Core direcionados ao .NET Framework.The in-process hosting model isn't supported for ASP.NET Core apps that target the .NET Framework.

O diagrama a seguir ilustra a relação entre o IIS, o Módulo do ASP.NET Core e um aplicativo hospedado em processo:The following diagram illustrates the relationship between IIS, the ASP.NET Core Module, and an app hosted in-process:

Módulo do ASP.NET Core

A solicitação chega da Web para o driver do HTTP.sys no modo kernel.A request arrives from the web to the kernel-mode HTTP.sys driver. O driver roteia as solicitações nativas ao IIS na porta configurada do site, normalmente, a 80 (HTTP) ou a 443 (HTTPS).The driver routes the native request to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). O módulo recebe a solicitação nativa e a passa para o Servidor HTTP do IIS (IISHttpServer).The module receives the native request and passes it to IIS HTTP Server (IISHttpServer). O servidor HTTP do IIS é uma implementação de servidor em processo do IIS que converte a solicitação de nativa para gerenciada.IIS HTTP Server is an in-process server implementation for IIS that converts the request from native to managed.

Depois que o Servidor HTTP do IIS processa a solicitação, a solicitação é enviada por push para o pipeline de middleware do ASP.NET Core.After the IIS HTTP Server processes the request, the request is pushed into the ASP.NET Core middleware pipeline. O pipeline do middleware manipula a solicitação e a passa como uma instância de HttpContext para a lógica do aplicativo.The middleware pipeline handles the request and passes it on as an HttpContext instance to the app's logic. A resposta do aplicativo é retornada ao IIS por meio do Servidor HTTP do IIS.The app's response is passed back to IIS through IIS HTTP Server. O IIS enviará a resposta ao cliente que iniciou a solicitação.IIS sends the response to the client that initiated the request.

A hospedagem em processo é uma opção de aceitação para os aplicativos existentes, mas o padrão dos modelos dotnet new é o modelo de hospedagem em processo para todos os cenários do IIS e do IIS Express.In-process hosting is opt-in for existing apps, but dotnet new templates default to the in-process hosting model for all IIS and IIS Express scenarios.

Modelo de hospedagem de fora do processoOut-of-process hosting model

Como os aplicativos ASP.NET Core são executados em um processo separado do processo de trabalho do IIS, o módulo realiza o gerenciamento de processos.Because ASP.NET Core apps run in a process separate from the IIS worker process, the module handles process management. O módulo inicia o processo para o aplicativo ASP.NET Core quando a primeira solicitação chega e reinicia o aplicativo se ele é desligado ou falha.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. Isso é basicamente o mesmo comportamento que o dos aplicativos que são executados dentro do processo e são gerenciados pelo WAS (Serviço de Ativação de Processos do 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).

O diagrama a seguir ilustra a relação entre o IIS, o Módulo do ASP.NET Core e um aplicativo hospedado de fora d processo:The following diagram illustrates the relationship between IIS, the ASP.NET Core Module, and an app hosted out-of-process:

Módulo do ASP.NET Core

As solicitações chegam da Web para o driver do HTTP.sys no modo kernel.Requests arrive from the web to the kernel-mode HTTP.sys driver. O driver roteia as solicitações ao IIS na porta configurada do site, normalmente, a 80 (HTTP) ou a 443 (HTTPS).The driver routes the requests to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). O módulo encaminha as solicitações ao Kestrel em uma porta aleatória do aplicativo, que não seja a porta 80 ou 443.The module forwards the requests to Kestrel on a random port for the app, which isn't port 80 or 443.

O módulo especifica a porta por meio de uma variável de ambiente na inicialização e o middleware de integração do IIS configura o servidor para escutar em 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}. Outras verificações são executadas e as solicitações que não se originam do módulo são rejeitadas.Additional checks are performed, and requests that don't originate from the module are rejected. O módulo não é compatível com encaminhamento de HTTPS, portanto, as solicitações são encaminhadas por HTTP, mesmo se recebidas pelo IIS por HTTPS.The module doesn't support HTTPS forwarding, so requests are forwarded over HTTP even if received by IIS over HTTPS.

Depois que o Kestrel coleta a solicitação do módulo, a solicitação é enviada por push ao pipeline do middleware do ASP.NET Core.After Kestrel picks up the request from the module, the request is pushed into the ASP.NET Core middleware pipeline. O pipeline do middleware manipula a solicitação e a passa como uma instância de HttpContext para a lógica do aplicativo.The middleware pipeline handles the request and passes it on as an HttpContext instance to the app's logic. O middleware adicionado pela integração do IIS atualiza o esquema, o IP remoto e pathbase para encaminhar a solicitação para o Kestrel.Middleware added by IIS Integration updates the scheme, remote IP, and pathbase to account for forwarding the request to Kestrel. A resposta do aplicativo é retornada ao IIS, que a retorna por push para o cliente HTTP que iniciou a solicitação.The app's response is passed back to IIS, which pushes it back out to the HTTP client that initiated the request.

Para obter as diretrizes de configuração do IIS e do módulo do ASP.NET Core, confira os tópicos a seguir:For IIS and ASP.NET Core Module configuration guidance, see the following topics:

O ASP.NET Core vem com os seguintes itens:ASP.NET Core ships with the following:

Ao usar o IIS ou o IIS Express, o aplicativo é executado em um processo separado do processo de trabalho do IIS (fora do processo) com o servidor 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.

Como os aplicativos ASP.NET Core são executados em um processo separado do processo de trabalho do IIS, o módulo realiza o gerenciamento de processos.Because ASP.NET Core apps run in a process separate from the IIS worker process, the module handles process management. O módulo inicia o processo para o aplicativo ASP.NET Core quando a primeira solicitação chega e reinicia o aplicativo se ele é desligado ou falha.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. Isso é basicamente o mesmo comportamento que o dos aplicativos que são executados dentro do processo e são gerenciados pelo WAS (Serviço de Ativação de Processos do 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).

O diagrama a seguir ilustra a relação entre o IIS, o Módulo do ASP.NET Core e um aplicativo hospedado de fora d processo:The following diagram illustrates the relationship between IIS, the ASP.NET Core Module, and an app hosted out-of-process:

Módulo do ASP.NET Core

As solicitações chegam da Web para o driver do HTTP.sys no modo kernel.Requests arrive from the web to the kernel-mode HTTP.sys driver. O driver roteia as solicitações ao IIS na porta configurada do site, normalmente, a 80 (HTTP) ou a 443 (HTTPS).The driver routes the requests to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). O módulo encaminha as solicitações ao Kestrel em uma porta aleatória do aplicativo, que não seja a porta 80 ou 443.The module forwards the requests to Kestrel on a random port for the app, which isn't port 80 or 443.

O módulo especifica a porta por meio de uma variável de ambiente na inicialização e o middleware de integração do IIS configura o servidor para escutar em 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}. Outras verificações são executadas e as solicitações que não se originam do módulo são rejeitadas.Additional checks are performed, and requests that don't originate from the module are rejected. O módulo não é compatível com encaminhamento de HTTPS, portanto, as solicitações são encaminhadas por HTTP, mesmo se recebidas pelo IIS por HTTPS.The module doesn't support HTTPS forwarding, so requests are forwarded over HTTP even if received by IIS over HTTPS.

Depois que o Kestrel coleta a solicitação do módulo, a solicitação é enviada por push ao pipeline do middleware do ASP.NET Core.After Kestrel picks up the request from the module, the request is pushed into the ASP.NET Core middleware pipeline. O pipeline do middleware manipula a solicitação e a passa como uma instância de HttpContext para a lógica do aplicativo.The middleware pipeline handles the request and passes it on as an HttpContext instance to the app's logic. O middleware adicionado pela integração do IIS atualiza o esquema, o IP remoto e pathbase para encaminhar a solicitação para o Kestrel.Middleware added by IIS Integration updates the scheme, remote IP, and pathbase to account for forwarding the request to Kestrel. A resposta do aplicativo é retornada ao IIS, que a retorna por push para o cliente HTTP que iniciou a solicitação.The app's response is passed back to IIS, which pushes it back out to the HTTP client that initiated the request.

Para obter as diretrizes de configuração do IIS e do módulo do ASP.NET Core, confira os tópicos a seguir:For IIS and ASP.NET Core Module configuration guidance, see the following topics:

KestrelKestrel

O Kestrel é o servidor Web padrão incluído nos modelos de projeto do ASP.NET Core.Kestrel is the default web server included in ASP.NET Core project templates.

O Kestrel pode ser usado:Kestrel can be used:

  • Sozinho, como um servidor de borda que processa solicitações diretamente de uma rede, incluindo a Internet.By itself as an edge server processing requests directly from a network, including the Internet.

    O Kestrel se comunica diretamente com a Internet, sem um servidor proxy reverso

  • Com um servidor proxy reverso como IIS (Serviços de Informações da Internet), Nginx ou Apache.With a reverse proxy server, such as Internet Information Services (IIS), Nginx, or Apache. Um servidor proxy reverso recebe solicitações HTTP da Internet e encaminha-as para o Kestrel.A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel.

    O Kestrel se comunica indiretamente com a Internet através de um servidor proxy reverso, tal como o IIS, o Nginx ou o Apache

Qualquer configuração de hospedagem (com ou sem um servidor proxy reverso) é compatível com os aplicativos ASP.NET Core 2.1 ou posteriores.Either hosting configuration—with or without a reverse proxy server—is supported for ASP.NET Core 2.1 or later apps.

Se o aplicativo aceita somente solicitações de uma rede interna, o Kestrel pode ser usado sozinho.If the app only accepts requests from an internal network, Kestrel can be used by itself.

O Kestrel se comunica diretamente com a rede interna

Se o aplicativo for exposto à Internet, o Kestrel deverá usar um servidor proxy reverso, como o IIS (Serviços de Informações da Internet), Nginx ou Apache.If the app is exposed to the Internet, Kestrel must use a reverse proxy server, such as Internet Information Services (IIS), Nginx, or Apache. Um servidor proxy reverso recebe solicitações HTTP da Internet e encaminha-as para o Kestrel.A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel.

O Kestrel se comunica indiretamente com a Internet através de um servidor proxy reverso, tal como o IIS, o Nginx ou o Apache

O motivo mais importante para usar um proxy reverso para implantações de servidores de borda voltados para o público que são expostas diretamente na Internet é a segurança.The most important reason for using a reverse proxy for public-facing edge server deployments that are exposed directly the Internet is security. As versões 1.x do Kestrel não incluem recursos de segurança importantes para proteção contra ataques da Internet.The 1.x versions of Kestrel don't include important security features to defend against attacks from the Internet. Isso inclui, mas não se limita aos tempos limite, limites de tamanho da solicitação e limites de conexões simultâneas apropriados.This includes, but isn't limited to, appropriate timeouts, request size limits, and concurrent connection limits.

Para obter diretrizes de configuração do Kestrel e informações sobre quando usar o Kestrel em uma configuração de proxy reverso, confira Implementação do servidor Web Kestrel no ASP.NET Core.For Kestrel configuration guidance and information on when to use Kestrel in a reverse proxy configuration, see Implementação do servidor Web Kestrel no ASP.NET Core.

Nginx com KestrelNginx with Kestrel

Para obter informações sobre como usar Nginx no Linux como um servidor proxy reverso para Kestrel, confira Host ASP.NET Core no Linux com Nginx.For information on how to use Nginx on Linux as a reverse proxy server for Kestrel, see Host ASP.NET Core no Linux com Nginx.

Apache com KestrelApache with Kestrel

Para obter informações sobre como usar Apache no Linux como um servidor proxy reverso para Kestrel, confira Hospedar o ASP.NET Core no Linux com o Apache.For information on how to use Apache on Linux as a reverse proxy server for Kestrel, see Hospedar o ASP.NET Core no Linux com o Apache.

Servidor HTTP do IISIIS HTTP Server

O servidor HTTP do IIS é um servidor em processo do IIS e é necessário para implantações em processo.IIS HTTP Server is an in-process server for IIS and required for in-process deployments. O módulo do ASP.NET Core manipula solicitações nativas do IIS entre o IIS e o servidor HTTP do IIS.The ASP.NET Core Module handles native IIS requests between IIS and IIS HTTP Server. Para obter mais informações, consulte Módulo do ASP.NET Core.For more information, see Módulo do ASP.NET Core.

HTTP.sysHTTP.sys

Se os aplicativos ASP.NET Core forem executados no Windows, o HTTP.sys será uma alternativa ao Kestrel.If ASP.NET Core apps are run on Windows, HTTP.sys is an alternative to Kestrel. O Kestrel geralmente é recomendado para melhor desempenho.Kestrel is generally recommended for best performance. O HTTP.sys pode ser usado em cenários em que o aplicativo é exposto à Internet e as funcionalidades necessárias são compatíveis com HTTP.sys, mas não com 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. Para obter mais informações, consulte Implementação do servidor Web HTTP.sys no ASP.NET Core.For more information, see Implementação do servidor Web HTTP.sys no ASP.NET Core.

O HTTP.sys se comunica diretamente com a Internet

O HTTP.sys também pode ser usado para aplicativos que são expostos somente a uma rede interna.HTTP.sys can also be used for apps that are only exposed to an internal network.

O HTTP.sys se comunica diretamente com a rede interna

Para obter as diretrizes de configuração do HTTP.sys, confira Implementação do servidor Web HTTP.sys no ASP.NET Core.For HTTP.sys configuration guidance, see Implementação do servidor Web HTTP.sys no ASP.NET Core.

Infraestrutura de servidor do ASP.NET CoreASP.NET Core server infrastructure

O IApplicationBuilder disponível no método Startup.Configure expõe a propriedade ServerFeatures do tipo IFeatureCollection.The IApplicationBuilder available in the Startup.Configure method exposes the ServerFeatures property of type IFeatureCollection. O Kestrel e o HTTP.sys expõem apenas um único recurso cada, o IServerAddressesFeature, mas diferentes implementações de servidor podem expor funcionalidades adicionais.Kestrel and HTTP.sys only expose a single feature each, IServerAddressesFeature, but different server implementations may expose additional functionality.

IServerAddressesFeature pode ser usado para descobrir a qual porta a implementação do servidor se acoplou durante o tempo de execução.IServerAddressesFeature can be used to find out which port the server implementation has bound at runtime.

Servidores personalizadosCustom servers

Se os servidores internos não atenderem aos requisitos do aplicativo, um servidor personalizado poderá ser criado.If the built-in servers don't meet the app's requirements, a custom server implementation can be created. O Guia de OWIN (Open Web Interface para .NET) demonstra como gravar uma implementação com base em NowinIServer.The Open Web Interface for .NET (OWIN) guide demonstrates how to write a Nowin-based IServer implementation. Somente as interfaces de recurso que o aplicativo usa exigem implementação, embora no mínimo IHttpRequestFeature e IHttpResponseFeature devam ser compatíveis.Only the feature interfaces that the app uses require implementation, though at a minimum IHttpRequestFeature and IHttpResponseFeature must be supported.

Inicialização do servidorServer startup

O servidor é iniciado quando o IDE (Ambiente de Desenvolvimento Integrado) ou o editor inicia o aplicativo:The server is launched when the Integrated Development Environment (IDE) or editor starts the app:

Ao iniciar o aplicativo usando um prompt de comando na pasta do projeto, o dotnet run inicia o aplicativo e o servidor (apenas 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). A configuração é especificada pela opção -c|--configuration, que é definida como Debug (padrão) ou Release.The configuration is specified by the -c|--configuration option, which is set to either Debug (default) or Release. Se os perfis de inicialização estiverem presentes em um arquivo launchSettings.json, use a opção --launch-profile <NAME> para definir o perfil de inicialização (por exemplo, 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). Para obter mais informações, confira dotnet run e pacote de distribuição do .NET Core.For more information, see dotnet run and .NET Core distribution packaging.

Compatibilidade com HTTP/2HTTP/2 support

O HTTP/2 é compatível com ASP.NET Core nos seguintes cenários de implantação:HTTP/2 is supported with ASP.NET Core in the following deployment scenarios:

  • KestrelKestrel
    • Sistema operacionalOperating system
      • Windows Server 2016/Windows 10 ou posterior†Windows Server 2016/Windows 10 or later†
      • Linux com OpenSSL 1.0.2 ou posterior (por exemplo, Ubuntu 16.04 ou posterior)Linux with OpenSSL 1.0.2 or later (for example, Ubuntu 16.04 or later)
      • O HTTP/2 será compatível com macOS em uma versão futura.HTTP/2 will be supported on macOS in a future release.
    • Estrutura de destino: .NET Core 2.2 ou posteriorTarget framework: .NET Core 2.2 or later
  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 ou posteriorWindows Server 2016/Windows 10 or later
    • Estrutura de destino: Não aplicável a implantações do HTTP.sys.Target framework: Not applicable to HTTP.sys deployments.
  • IIS (em processo)IIS (in-process)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posteriorWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Estrutura de destino: .NET Core 2.2 ou posteriorTarget framework: .NET Core 2.2 or later
  • IIS (fora do processo)IIS (out-of-process)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posteriorWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Conexões de servidor de borda voltadas para o público usam HTTP/2, mas a conexão de proxy reverso para o Kestrel usa HTTP/1.1.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • Estrutura de destino: Não aplicável a implantações fora do processo do IIS.Target framework: Not applicable to IIS out-of-process deployments.

†O Kestrel tem suporte limitado para HTTP/2 no Windows Server 2012 R2 e Windows 8.1.†Kestrel has limited support for HTTP/2 on Windows Server 2012 R2 and Windows 8.1. O suporte é limitado porque a lista de conjuntos de codificação TLS disponível nesses sistemas operacionais é limitada.Support is limited because the list of supported TLS cipher suites available on these operating systems is limited. Um certificado gerado usando um ECDSA (Algoritmo de Assinatura Digital Curva Elíptica) pode ser necessário para proteger conexões 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 posteriorWindows Server 2016/Windows 10 or later
    • Estrutura de destino: Não aplicável a implantações do HTTP.sys.Target framework: Not applicable to HTTP.sys deployments.
  • IIS (fora do processo)IIS (out-of-process)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posteriorWindows Server 2016/Windows 10 or later; IIS 10 or later
    • Conexões de servidor de borda voltadas para o público usam HTTP/2, mas a conexão de proxy reverso para o Kestrel usa HTTP/1.1.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • Estrutura de destino: Não aplicável a implantações fora do processo do IIS.Target framework: Not applicable to IIS out-of-process deployments.

Uma conexão HTTP/2 precisa usar ALPN (Application-Layer Protocol Negotiation) e TLS 1.2 ou posterior.An HTTP/2 connection must use Application-Layer Protocol Negotiation (ALPN) and TLS 1.2 or later. Para obter mais informações, consulte os tópicos referentes aos seus cenários de implantação do servidor.For more information, see the topics that pertain to your server deployment scenarios.

Recursos adicionaisAdditional resources