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. app.UseHttpsRedirection(); |
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 => var app = builder.Build(); // Configure the HTTP request pipeline. app.UseHttpsRedirection();
|
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…