.NET

17 fev, 2023

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

Publicidade

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…