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 as coloca na superfície para o aplicativo como conjuntos de recursos de solicitação compostos em um HttpContext.The server implementation listens for HTTP requests and surfaces them to the app as sets of request features composed into an HttpContext.

O ASP.NET Core é fornecido com as seguintes implementações de servidor:ASP.NET Core ships with the following server implementations:

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 sozinho ou com um servidor proxy reverso como IIS, Nginx ou Apache.Kestrel can be used by itself or with a reverse proxy server, such as IIS, Nginx, or Apache. Um servidor proxy reverso recebe solicitações HTTP da Internet e as encaminha para o Kestrel após algum tratamento preliminar.A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel after some preliminary handling.

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

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 —com ou sem um servidor proxy reverso— é uma configuração de hospedagem válida e compatível com o ASP.NET Core 2.0 ou aplicativos posteriores.Either configuration—with or without a reverse proxy server—is a valid and supported hosting configuration for ASP.NET Core 2.0 or later apps. Para obter mais informações, consulte Quando usar Kestrel com um proxy reverso.For more information, see When to use Kestrel with a reverse proxy.

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 o IIS, o Nginx ou o Apache como um servidor proxy reverso.If the app is exposed to the Internet, Kestrel must use IIS, Nginx, or Apache as a reverse proxy server. Um servidor proxy reverso recebe solicitações HTTP da Internet e as encaminha para o Kestrel após algum tratamento preliminar, conforme mostrado no diagrama a seguir:A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel after some preliminary handling, as shown in the following diagram:

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 têm recursos de segurança importantes para proteção contra ataques da Internet.The 1.x versions of Kestrel don't have 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 mais informações, consulte Quando usar Kestrel com um proxy reverso.For more information, see When to use Kestrel with a reverse proxy.

O IIS, o Nginx ou o Apache não podem ser usados sem o Kestrel ou uma implementação de servidor personalizado.IIS, Nginx, and Apache can't be used without Kestrel or a custom server implementation. O ASP.NET Core foi projetado para ser executado em seu próprio processo, de modo que ele pode se comportar de forma consistente entre plataformas.ASP.NET Core was designed to run in its own process so that it can behave consistently across platforms. O IIS, o Nginx e o Apache determinam seu próprio procedimento de inicialização e o ambiente.IIS, Nginx, and Apache dictate their own startup procedure and environment. Para usar essas tecnologias de servidor diretamente, o ASP.NET Core precisaria adaptar-se aos requisitos de cada servidor.To use these server technologies directly, ASP.NET Core would need to adapt to the requirements of each server. Usando uma implementação do servidor Web, tal como Kestrel, o ASP.NET Core tem controle sobre o processo de inicialização e o ambiente quando hospedado em tecnologias de servidor diferentes.Using a web server implementation, such as Kestrel, ASP.NET Core has control over the startup process and environment when hosted on different server technologies.

IIS com KestrelIIS with Kestrel

Ao usar o IIS ou o IIS Express, o aplicativo do ASP.NET Core é executado no mesmo processo que o processo de trabalho do IIS (o modelo de hospedagem em processo) ou em um processo de trabalho separado do IIS (o modelo de hospedagem fora do processo).When using IIS or IIS Express, the ASP.NET Core app either runs in the same process as the IIS worker process (the in-process hosting model) or in a process separate from the IIS worker process (the out-of-process hosting model).

O Módulo do ASP.NET Core é um módulo nativo do IIS que manipula solicitações nativas do IIS entre o servidor HTTP em processo do IIS ou o servidor Kestrel fora do processo.The ASP.NET Core Module is a native IIS module that handles native IIS requests between either the in-process IIS Http Server or the out-of-process Kestrel server. Para obter mais informações, consulte Módulo do ASP.NET Core.For more information, see Módulo do ASP.NET Core.

Ao usas o IIS ou IIS Express como um proxy reverso para o ASP.NET Core, o aplicativo ASP.NET Core é executado em um processo separado do processo de trabalho do IIS.When using IIS or IIS Express as a reverse proxy for ASP.NET Core, the ASP.NET Core app runs in a process separate from the IIS worker process. No processo do IIS, o Módulo do ASP.NET Core coordena a relação do proxy reverso.In the IIS process, the ASP.NET Core Module coordinates the reverse proxy relationship. As funções primárias do módulo do ASP.NET Core são iniciar o aplicativo do ASP.NET Core, reiniciá-lo quando ele falhar e encaminhar o tráfego HTTP para o aplicativo.The primary functions of the ASP.NET Core Module are to start the ASP.NET Core app, restart the app when it crashes, and forward HTTP traffic to the app. Para obter mais informações, consulte Módulo do ASP.NET Core.For more information, see Módulo do 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, veja Hospedar em Linux com o Nginx.For information on how to use Nginx on Linux as a reverse proxy server for Kestrel, see Host on Linux with Nginx.

Apache com KestrelApache with Kestrel

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

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 informações sobre HTTP.sys, veja HTTP.sys.For information on HTTP.sys, see HTTP.sys.

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

O HTTP.sys é chamado WebListener no ASP.NET Core 1.x.HTTP.sys is named WebListener in ASP.NET Core 1.x. Se os aplicativos ASP.NET Core forem executados no Windows, o WebListener será uma alternativa para cenários em que o IIS não está disponível para hospedar aplicativos.If ASP.NET Core apps are run on Windows, WebListener is an alternative for scenarios where IIS isn't available to host apps.

O WebListener se comunica diretamente com a Internet

O WebListener também poderá ser usado no lugar do Kestrel para aplicativos expostos somente a uma rede interna se as funcionalidades necessárias forem compatíveis com o WebListener, mas não com o Kestrel.WebListener can also be used in place of Kestrel for apps that are only exposed to an internal network, if required capabilities are supported by WebListener but not Kestrel. Para obter mais informações sobre o WebListener, consulte WebListener.For information on WebListener, see WebListener.

O WebListener se comunica diretamente com a rede interna

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. Kestrel e HTTP.sys (WebListener no ASP.NET Core 1.x) expõem apenas um único recurso cada, IServerAddressesFeature, mas as implementações de servidor diferentes podem expor funcionalidade adicional.Kestrel and HTTP.sys (WebListener in ASP.NET Core 1.x) 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 de IServer com base em Nowin.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. Porém, no mínimo IHttpRequestFeature e IHttpResponseFeature devem ter suporte.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

Ao usar o Visual Studio, o Visual Studio para Mac ou o Visual Studio Code, o servidor é iniciado quando o aplicativo é iniciado pelo IDE (ambiente de desenvolvimento integrado).When using Visual Studio, Visual Studio for Mac, or Visual Studio Code, the server is launched when the app is started by the Integrated Development Environment (IDE). No Visual Studio no Windows, os perfis de inicialização podem ser usados para iniciar o aplicativo e o servidor com o IIS Express/Módulo do ASP.NET Core ou o console.In Visual Studio on Windows, launch profiles can be used to start the app and server with either IIS Express/ASP.NET Core Module or the console. No Visual Studio Code, o aplicativo e o servidor são iniciados por Omnisharp, que ativa o depurador CoreCLR.In Visual Studio Code, the app and server are started by Omnisharp, which activates the CoreCLR debugger. Usando o Visual Studio para Mac, o aplicativo e o servidor são iniciados pelo depurador de modo reversível Mono.Using Visual Studio for Mac, the app and server are started by the Mono Soft-Mode Debugger.

Ao iniciar um aplicativo com um prompt de comando na pasta do projeto, a execução dotnet inicia o aplicativo e o servidor (somente no Kestrel e no HTTP.sys).When launching an 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, veja os tópicos execução dotnet e Empacotamento de distribuição do .NET Core.For more information, see the dotnet run and .NET Core distribution packaging topics.

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 de 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 IIS fora de processo.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 de 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 IIS fora de processo.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