Search code examples
asp.net-mvcasp.net-corekestrel-http-serverasp.net-core-3.1kestrel

How can I change Kestrel (AspNetCore) listening port by environment variables in netcore3.1


I have aspnetcore3.1 project, and I want to set custom port for Kestrel (other than default 5000). I can possibly do it in Program.cs by adding

Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
    webBuilder.ConfigureKestrel(options =>
    {
        options.ListenLocalhost(80);
    });
    webBuilder.UseStartup<Startup>();
})

But this cannot be applied to my case, so wondered, how can this be done by environment variable?


Solution

  • There are multiple ways to achieve this as documented here.

    1. ASPNETCORE_URLS environment variable.
    2. --urls command-line argument.
    3. urls host configuration key.
    4. UseUrls extension method.

    To achieve this using an environment variable, simply create an environment variable called ASPNETCORE_URLS and set the value to the URL you'd like to use

    Typically this would be http://+:<port> or https://+:<port>

    Another method which, at the time of writing this answer, isn't described above is via the hostsettings.json file.

    You can configure the URL & Port by creating a hostsettings.json configuration file and adding the urls key, then add hostsettings.json to your IConfigurationBuilder when building your WebHostBuilder.

    https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-3.1#override-configuration

    Here is the code snippet from the link, in case this link ever goes dead.

    Create your hostsettings.json file containing the urls key with your value(s)

    {
        urls: "http://*:5005"
    }
    

    Register hostsettings.json in your IConfigurationBuilder

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
    
        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false)
                .AddJsonFile("hostsettings.json", optional: true)
                .AddCommandLine(args)
                .Build();
    
            return WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://*:5000")
                .UseConfiguration(config)
                .UseStartup<Startup>();
        }
    }