ASP .NET Core - Rodando um serviço em uma porta específica


Hoje veremos como rodar um serviço em uma porta específica usando o .NET 6.

Para fins de teste ou demonstração você pode definir uma porta localhost específica e assim minimizar conflitos, principalmente se tiver vários projetos e serviços em execução ao mesmo tempo.


No .NET 5 uma das opções era usar o método UseUrls() de IWebHostBuilder para definir uma porta específica na classe Program :
 

public static IHostBuilder CreateHostBuilder(string[] args) =>
   Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder =>
       {
             webBuilder.UseStartup<Startup>()
                    .UseUrls("http://localhost:9800");
      });


Aqui estamos definindo a porta 9800 em localhost.
 

Como ficaria este código no .NET 6 ?

 

Vamos criar um projeto WebAPI chamado teste  : dotnet new webapi -o teste

 

A seguir vamos verificar os valores do arquivo lauchSettings :

 

...
,
  "profiles": {
    "teste": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "https://localhost:7014;http://localhost:5235",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
   ...
}

Temos a definição das portas para https e para http e podemos notar que no .NET 6 agora são geradas portas aleatórias e não mais as portas 5000 e 5001 que antes eram o padrão.

Pois bem, vamos agora tentar sobrescrever as portas definidas especificando a porta 9800 para execução da nossa aplicação.

Para isso a primeira opção seria usar o método UseUrls da propriedade WebHost conforme mostra o código abaixo:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.WebHost.UseUrls("http://localhost:9800");

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Mas ao executar você vai verificar que isso não funciona as configurações usadas são as definidas em launchSettings.

Para remediar esse problema podemos usar o método de extensão ConfigureKestrel que permite fornecer configuração adicional :

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.WebHost.ConfigureKestrel(options =>
          options.ListenLocalhost(9800));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

 

O método ListenLocalHost faz parte do KestrelServerOptions que pode ser definido facilmente no código usando o método "ConfigureKestrel" na mesma propriedade WebHost. O parâmetro é um delegado que usa um KestrelServerOptions.

Dentro da expressão lambda, podemos chamar "ListenLocalHost(9800)" nas opções. Isso configurará nosso serviço para ser executado em http://localhost:9800. (consulte a documentação aqui )

Naturalmente existem outras formas de definir a mesma configuração e uma delas é definir as configurações no arquivo appsettings.json :
 

{ "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",

  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:9800"
      }
    }
  }

 }

 

 

Ao executar o projeto essas configurações vão sobrescrever os valores definidos em launchSettings.

 

Outra maneira de especificar a porta específica é usar a opção "--urls" na linha de comando.


Exemplo :   dotnet run --urls "http://localhost:9800"


Existem também as variáveis de ambiente ASPNETCORE_URLS e DOTNET_URLS que podemos usar :

1- Usando o ambiente do bash:  (No Docker a variável de ambiente ASPNETCORE_URLS é definida para a porta 80)

export ASPNETCORE_URLS="http://localhost:9800;https://localhost:9801"
 

2- Usando o ambiente do PowerShell

$env:ASPNETCORE_URLS="https://localhost:9801"

E estamos conversados...

"Deus tenha misericórdia de nós e nos abençoe; e faça resplandecer o seu rosto sobre nós (Selá.)
Para que se conheça na terra o teu caminho, e entre todas as nações a tua salvação."
Salmos 67:1,2

Referências:


José Carlos Macoratti