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.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.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":
{
|
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: