ASP .NET Core - Fazendo a hospedagem no Http.Sys


Neste artigo vamos discutir como hospedar uma aplicação ASP .NET Core Web API usando o HTTP.Sys.

O HTTP.sys é um servidor Web para ASP.NET Core executado apenas no Windows. O HTTP.sys é uma alternativa ao servidor Kestrel e oferece alguns recursos não disponibilizados pelo Kestrel.

O HTTP.sys dá suporte aos seguintes recursos:

Versões do Windows compatíveis:

Quando usar o HTTP.sys

O HTTP.sys é útil nas implantações em que:

Assim, o  HTTP.sys é uma tecnologia madura que protege contra vários tipos de ataques e proporciona as propriedades de robustez, segurança e escalabilidade de um servidor Web completo. O próprio IIS é executado como um ouvinte HTTP sobre o HTTP.sys.

Como usar o HTTP.sys

Para configurar o aplicativo ASP.NET Core para usar o HTTP.sys podemos fazer assim:

1 - Com a ASP .NET Core 2.1 ou posterior, ou, se você estiver usando o metapacote Microsoft.AspNetCore.App basta referenciar o pacote Microsoft.AspNetCore.Server.HttpSys no seu código.

2- Depois invoque o método de extensão UseHttpSys ao compilar o Web Host especificando as opções definidas em HttpSysOptions necessárias.

Obs: Na ASP .NET Core 2.0 temos que incluir o pacote Nuget Microsoft.AspNetCore.Server.HttpSys  no projeto.

As principais opções disponíveis são:

Propriedade Descrição Padrão
AllowSynchronousIO Controlar quando a Entrada/Saída síncrona deve ser permitida para HttpContext.Request.Body e HttpContext.Response.Body. true
Authentication.AllowAnonymous Permitir solicitações anônimas. true
Authentication.Schemes Especificar os esquemas de autenticação permitidos. É possível modificar a qualquer momento antes de descartar o ouvinte. Os valores são fornecidos pela enumeração AuthenticationSchemes: Basic, Kerberos, Negotiate, None e NTLM. None
EnableResponseCaching Tentativa de cache do modo kernel para obtenção de respostas com cabeçalhos qualificados. A resposta pode não incluir Set-Cookie, Vary ou cabeçalhos Pragma. Ela deve incluir um cabeçalho Cache-Control que seja public e um valor shared-max-age ou max-age, ou um cabeçalho Expires. true
MaxAccepts O número máximo de aceitações simultâneas. 5 × Ambiente.
ProcessorCount
MaxConnections O número máximo de conexões simultâneas a serem aceitas. Use  -1 como infinito. Use null a fim de usar a configuração que abranja toda máquina do registro. null
(ilimitado)
RequestQueueLimit O número máximo de solicitações que podem ser colocadas na fila. 1000
ThrowWriteExceptions Indica se as gravações do corpo da resposta que falham quando o cliente se desconecta devem gerar exceções ou serem concluídas normalmente. false
(concluir normalmente)

Hospedando uma Web API com HTTP.Sys

A título de exemplo vamos criar uma aplicação ASP .NET Core usando o template API usando o VS 2017 Community com o nome WebAPI_Http.Sys.

Essa WebAPI vai criar um controlador ValuesControllers que iremos usar. Para efeito de teste vamos alterar os métodos HttpGet Get e Get(int id) conforme abaixo:

        ....
       // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "Banana", "Laranja","Maça", "Manga", "Pera", "Abacate" };
        }
        // GET api/values/5
        [HttpGet("{id}")]
        public ActionResult<string> Get(int id)
        {
            return "Melancia";
        }
       ....

 A seguir abra o arquivo Program do projeto e altere o código conforme abaixo:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.HttpSys;
using System;
namespace WebAPI_Http.sys
{
    public class Program
    {
        public static void Main(string[] args)
        {
             Console.WriteLine(" #### Executando a WEb API com HTTP.sys ####\n");
            CreateWebHostBuilder(args).Build().Run();
        }
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
               WebHost.CreateDefaultBuilder(args)
              .UseStartup<Startup>()
              .UseHttpSys(options =>
              {
                  options.Authentication.Schemes = AuthenticationSchemes.None;
                  options.Authentication.AllowAnonymous = true;
                  options.MaxConnections = null;
                  options.MaxRequestBodySize = 30000000;
                  options.UrlPrefixes.Add("http://localhost:7000");
        });    
    }
}

Acima estamos usando o método UseHttpSys e definindo algumas opções como : permitir o acesso anônimo, e tamanho das requisições e a porta onde a aplicação vai atender.

Para testar no visual studio, certifique-se de não executar a aplicação no perfil do IIS-Express/IIS mas selecione o perfil como a aplicação WebAPI_Http.Sys :

Executando o projeto com essas configurações iremos obter o seguinte resultado no console:

Abrindo um navegador e acessando http://localhost:7000/api/values iremos obter o seguinte resultado:

Nota: Para a ASP .NET Core 2.0  o código do arquivo Program ficaria assim:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.HttpSys;
using System;
namespace WebAPI_Http.sys
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(" #### Executando a WEb API com HTTP.sys ####\n");
            BuildWebHost(args).Run();
        }   
        public static IWebHost BuildWebHost(string[] args) =>
             WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .UseHttpSys(options =>
                    {
                        options.Authentication.Schemes = AuthenticationSchemes.NTLM;
                        options.Authentication.AllowAnonymous = true;
                        options.MaxConnections = 100;
                        options.MaxRequestBodySize = 30000000;
                        options.UrlPrefixes.Add("http://localhost:7000");
                    })
            .Build();
    }
}

Pegue o projeto completo aqui:   WebAPI_Http.sys.zip

"O Senhor é o meu rochedo, e o meu lugar forte, e o meu libertador; o meu Deus, a minha fortaleza, em quem confio; o meu escudo, a força da minha salvação, e o meu alto refúgio."
Salmos 18:2

Referências:


José Carlos Macoratti