Partilhar via


Implementações de servidor Web no ASP.NET Core

Observação

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.

Advertência

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.

Importante

Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.

Para a versão atual, consulte a versão .NET 9 deste artigo.

Por Tom Dykstra, Steve Smith, Stephen Haltere Chris Ross

Um aplicativo ASP.NET Core é executado com uma implementação de servidor HTTP em processo. A implementação do servidor percebe as solicitações HTTP e as disponibiliza à aplicação como um conjunto de funcionalidades de solicitação , estruturado em um HttpContext.

ASP.NET Core é fornecido com o seguinte:

Ao usar o IIS ou IIS Express, a aplicação pode funcionar:

  • No mesmo processo que o processo de trabalho do IIS (o modelo de hospedagem em processo ) com o Servidor HTTP do IIS. em execução é a configuração recomendada.
  • Num processo separado do processo de trabalho do IIS (o modelo de hospedagem fora de processo ) com o servidor Kestrel.

O ASP.NET Core Module é um módulo nativo do IIS que lida com solicitações nativas do IIS entre o IIS e o Servidor HTTP do IIS em execução ou Kestrel. Para obter mais informações, consulte Módulo ASP.NET Core (ANCM) para IIS.

Kestrel vs. HTTP.sys

Kestrel tem as seguintes vantagens em relação ao HTTP.sys:

  • Melhor desempenho e utilização da memória.
  • Multiplataforma
  • Agilidade, é desenvolvido e corrigido independentemente do sistema operacional.
  • Porta programática e configuração TLS
  • Extensibilidade que permite protocolos como PPv2 e transportes alternativos.

Http.Sys opera como um componente de modo kernel compartilhado com as seguintes características que o Kestrel não tem:

Modelos de hospedagem

Vários modelos de hospedagem estão disponíveis:

  • Kestrel auto-hospedagem: O servidor Web Kestrel é executado sem a necessidade de qualquer outro servidor Web externo, como IIS ou HTTP.sys.

  • HTTP.sys auto-hospedagem é uma alternativa ao Kestrel. Kestrel é recomendado sobre HTTP.sys, a menos que a aplicação exija recursos não disponíveis no Kestrel.

  • Hospedagem em processo do IIS: um aplicativo ASP.NET Core é executado no mesmo processo que seu processo de trabalho do IIS. A hospedagem em processo do IIS oferece melhor desempenho em relação à hospedagem fora de processo do IIS porque as solicitações não são intermediadas por proxy pelo adaptador de loopback, uma interface de rede que retorna o tráfego de rede de saída de volta para a mesma máquina. O IIS gere a gestão de processos com o WAS (Serviço de Ativação de Processos do Windows).

  • Hospedagem fora de processo do IIS: As aplicações ASP.NET Core são executadas num processo separado do processo de trabalho do IIS, e o módulo trata do gerenciamento do processo. O módulo inicia o processo para o aplicativo ASP.NET Core quando a primeira solicitação chega e reinicia o aplicativo se ele for desligado ou falhar. Esse é essencialmente o mesmo comportamento visto com aplicativos executados em processo gerenciados pelo Serviço de Ativação de Processos do Windows (WAS). O uso de um processo separado também permite hospedar mais de um aplicativo do mesmo pool de aplicativos.

Para obter mais informações, consulte o seguinte:

Kestrel

O servidor Kestrel é a implementação padrão do servidor HTTP multiplataforma. Kestrel oferece o melhor desempenho e utilização de memória, mas não tem alguns dos recursos avançados em HTTP.sys. Para obter mais informações, consulte Kestrel vs. HTTP.sys neste documento.

Use Kestrel:

  • Por si só, como um servidor de borda processando solicitações diretamente de uma rede, incluindo a Internet.

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

  • Com um servidor proxy reverso , como Internet Information Services (IIS), Nginxou Apache. Um servidor proxy reverso recebe solicitações HTTP da Internet e as encaminha para Kestrel.

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

A configuração de hospedagem — com ou sem um servidor proxy reverso — é suportada.

Para obter orientação para configuração de Kestrel e informações sobre quando usar Kestrel numa configuração de proxy reverso, consulte o servidor web Kestrel no ASP.NET Core.

ASP.NET Core é fornecido com o seguinte:

Ao usar IIS ou IIS Express, o aplicativo é executado em um processo separado do processo de trabalho do IIS (fora de processo ) com o servidor Kestrel.

Como ASP.NET aplicativos principais são executados em um processo separado do processo de trabalho do IIS, o módulo lida com o gerenciamento de processos. O módulo inicia o processo para o aplicativo ASP.NET Core quando a primeira solicitação chega e reinicia o aplicativo se ele for desligado ou falhar. Esse é essencialmente o mesmo comportamento visto com aplicativos executados em processo gerenciados pelo Serviço de Ativação de Processos do Windows (WAS).

O diagrama a seguir ilustra a relação entre o IIS, o ASP.NET Core Module e um aplicativo hospedado fora do processo:

ASP.NET Módulo Core

As solicitações chegam da web para o driver HTTP.sys do modo do kernel. O driver roteia as solicitações para o IIS na porta configurada do site, geralmente 80 (HTTP) ou 443 (HTTPS). O módulo encaminha as solicitações para Kestrel em uma porta aleatória para o aplicativo, que não é a porta 80 ou 443.

O módulo especifica a porta por meio de uma variável de ambiente na inicialização e o de Middleware de Integração do IIS configura o servidor para escutar http://localhost:{port}. Verificações adicionais são realizadas e solicitações que não são originadas do módulo são rejeitadas. O módulo não oferece suporte ao encaminhamento HTTPS, portanto, as solicitações são encaminhadas por HTTP, mesmo se recebidas pelo IIS por HTTPS.

Após o Kestrel apanhar a solicitação do módulo, a solicitação é encaminhada para o pipeline intermediário do ASP.NET Core. O pipeline de middleware lida com a solicitação e a transmite como uma instância HttpContext para a lógica da aplicação. O middleware adicionado pela Integração do IIS atualiza o esquema, o IP remoto e a base de caminho para levar em conta o encaminhamento da solicitação para Kestrel. A resposta do aplicativo é passada de volta para o IIS, que a envia de volta para o cliente HTTP que iniciou a solicitação.

Para obter as diretrizes de configuração do IIS e do ASP.NET Módulo Principal, consulte os seguintes tópicos:

Nginx com Kestrel

Para obter informações sobre como usar o Nginx no Linux como um servidor proxy reverso para Kestrel, consulte Host ASP.NET Core no Linux com Nginx.

HTTP.sys

Se os aplicativos ASP.NET Core forem executados no Windows, HTTP.sys é uma alternativa ao Kestrel. Kestrel é recomendado em vez de HTTP.sys a menos que a aplicação exija recursos não disponíveis no Kestrel. Para obter mais informações, consulte HTTP.sys implementação de servidor Web no ASP.NET Core.

HTTP.sys se comunica diretamente com a Internet

HTTP.sys também pode ser usado para aplicativos que só estão expostos a uma rede interna.

HTTP.sys comunica diretamente com a rede interna

Para obter orientação de configuração HTTP.sys, consulte a implementação de Servidor Web HTTP.sys no ASP.NET Core.

ASP.NET Infraestrutura de servidor principal

O IApplicationBuilder disponível no método Startup.Configure expõe a propriedade ServerFeatures do tipo IFeatureCollection. Kestrel e HTTP.sys expõem apenas um único recurso cada, IServerAddressesFeature, mas implementações de servidor diferentes podem expor funcionalidades adicionais.

IServerAddressesFeature pode ser usado para descobrir qual porta a implementação do servidor vinculou em tempo de execução.

Servidores personalizados

Se os servidores internos não atenderem aos requisitos do aplicativo, uma implementação de servidor personalizada poderá ser criada. O guia Open Web Interface for .NET (OWIN) demonstra como escrever uma implementação baseada em NowinIServer. Apenas as interfaces de funcionalidades que a aplicação usa exigem implementação, embora, no mínimo, IHttpRequestFeature e IHttpResponseFeature devam ser suportadas.

Inicialização do servidor

O servidor é iniciado quando o ambiente de desenvolvimento integrado (IDE) ou editor inicia o aplicativo:

Ao iniciar a aplicação a partir de um prompt de comando na pasta do projeto, o comando dotnet run inicia a aplicação e o servidor (Kestrel e somente HTTP.sys). A configuração é especificada pela opção -c|--configuration, que é definida como Debug (padrão) ou Release.

Um arquivo launchSettings.json fornece configuração ao iniciar um aplicativo com dotnet run ou com um depurador integrado em ferramentas, como o Visual Studio. Se os perfis de inicialização estiverem presentes em um arquivo de launchSettings.json, use a opção --launch-profile {PROFILE NAME} com o comando dotnet run ou selecione o perfil no Visual Studio. Para obter mais informações, consulte dotnet run e empacotamento de distribuição do .NET Core.

Suporte HTTP/2

HTTP/2 é suportado com o ASP.NET Core nos seguintes cenários de implantação:

  • Kestrel
    • Sistema Operativo
      • Windows Server 2016/Windows 10 ou posterior†
      • Linux com OpenSSL 1.0.2 ou posterior (por exemplo, Ubuntu 16.04 ou posterior)
      • macOS 10.15 ou posterior
    • Estrutura de destino: .NET Core 2.2 ou posterior
  • HTTP.sys
    • Windows Server 2016/Windows 10 ou posterior
    • Estrutura de destino: Não aplicável a implementações HTTP.sys.
  • IIS (em processo)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posterior
    • Estrutura de destino: .NET Core 2.2 ou posterior
  • IIS (fora de processo)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posterior
    • As conexões de servidor de borda orientadas ao público utilizam HTTP/2, mas a conexão de proxy reverso para Kestrel utiliza HTTP/1.1.
    • Estrutura de destino: Não aplicável a implantações fora do processo do IIS.

†Kestrel tem suporte limitado para HTTP/2 no Windows Server 2012 R2 e Windows 8.1. O suporte é limitado porque a lista de pacotes de codificação TLS suportados disponíveis nesses sistemas operacionais é limitada. Um certificado gerado usando um algoritmo de assinatura digital de curva elíptica (ECDSA) pode ser necessário para proteger conexões TLS.

  • Kestrel
    • Sistema Operativo
      • Windows Server 2016/Windows 10 ou posterior†
      • Linux com OpenSSL 1.0.2 ou posterior (por exemplo, Ubuntu 16.04 ou posterior)
      • HTTP/2 será suportado no macOS em uma versão futura.
    • Estrutura de destino: .NET Core 2.2 ou posterior
  • HTTP.sys
    • Windows Server 2016/Windows 10 ou posterior
    • Estrutura de destino: Não aplicável a implantações HTTP.sys.
  • IIS (em processo)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posterior
    • Estrutura de destino: .NET Core 2.2 ou posterior
  • IIS (fora de processo)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posterior
    • As conexões de servidor de borda voltadas para o público usam HTTP/2, mas a conexão de proxy reverso para Kestrel usa HTTP/1.1.
    • Framework de destino: Não aplicável a implementações fora do processo do IIS.

†Kestrel tem suporte limitado para HTTP/2 no Windows Server 2012 R2 e Windows 8.1. O suporte é limitado porque a lista de pacotes de codificação TLS suportados disponíveis nesses sistemas operacionais é limitada. Um certificado gerado usando um algoritmo de assinatura digital de curva elíptica (ECDSA) pode ser necessário para proteger conexões TLS.

  • Kestrel
    • Sistema Operativo
      • Windows Server 2016/Windows 10 ou posterior†
      • Linux com OpenSSL 1.0.2 ou posterior (por exemplo, Ubuntu 16.04 ou posterior)
      • HTTP/2 será suportado no macOS em uma versão futura.
    • Estrutura de destino: .NET Core 2.2 ou posterior
  • HTTP.sys
    • Windows Server 2016/Windows 10 ou posterior
    • Framework de destino: Não aplicável a implementações HTTP.sys.
  • IIS (em processo)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posterior
    • Estrutura de destino: .NET Core 2.2 ou posterior
  • IIS (fora de processo)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posterior
    • As conexões de servidor de borda voltadas para o público usam HTTP/2, mas a conexão de proxy reverso para Kestrel usa HTTP/1.1.
    • Framework de destino: Não aplicável a implementações fora de processo do IIS.

†Kestrel tem suporte limitado para HTTP/2 no Windows Server 2012 R2 e Windows 8.1. O suporte é limitado porque a lista de pacotes de codificação TLS suportados disponíveis nesses sistemas operacionais é limitada. Um certificado gerado usando um algoritmo de assinatura digital de curva elíptica (ECDSA) pode ser necessário para proteger conexões TLS.

  • HTTP.sys
    • Windows Server 2016/Windows 10 ou posterior
    • Estrutura de destino: Não aplicável a implantações HTTP.sys.
  • IIS (fora de processo)
    • Windows Server 2016/Windows 10 ou posterior; IIS 10 ou posterior
    • As conexões dos servidores periféricos voltadas ao público usam HTTP/2, mas a conexão de proxy reverso para o Kestrel usa HTTP/1.1.
    • Framework de destino: Não aplicável a implementações fora de processo do IIS.

Uma conexão HTTP/2 deve usar Application-Layer Negociação de Protocolo (ALPN) e TLS 1.2 ou posterior. Para obter mais informações, consulte os tópicos que dizem respeito aos cenários de implantação do servidor.

Padrões de aplicativos Web corporativos

Para obter orientação sobre como criar um aplicativo ASP.NET Core confiável, seguro, com desempenho, testável e escalável, consulte Padrões de aplicativos Web corporativos. Está disponível um aplicativo Web de exemplo completo com qualidade de produção que implementa os padrões.

Recursos adicionais