Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebHostBuilder. How to set url address using CommandLine in .NET-Core 2.0?

I use below code to add CommandLine in my .Net-Core 1.2 environment, I can use the command line like dotnet run --urls "http://a.cn.com:5000" --environment "Production".

public static void Main(string[] args)
{
     var config = new ConfigurationBuilder()
                .AddJsonFile("hosting.json", optional: true)
                .AddCommandLine(args)
                .Build();

     var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseConfiguration(config)
                .Build();

     host.Run();
}

And After migrate to .net core 2.0 it becomes like that

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args)
{
    return WebHost.CreateDefaultBuilder(args)
                .ConfigureLogging((context, logging) =>
                {
                    logging.AddSerilog();
                })
                .UseStartup<Startup>()
                .Build();
 }

I use the same command line ,it fails. How to add the Command in .net core 2.0 ?

Supply: 2017.08.17 launchsetting.json below :

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5005/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Robert.Project.Web": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5006"
    }
  }
}

What I expect the listening is Now listening on http://a.cn.com:5000 What I get is that:

enter image description here

And we should not add any other code in Program.cs file, cause CreateDefaultBuilder is contain addCommandLine. for more detail, you can see WebHost.cs#L177

Supply 2017 0817 17:44 UTC+8

[::] is the IPv6 equivalent of IPv4 0.0.0.0.

like image 666
doublnt Avatar asked Oct 17 '22 07:10

doublnt


1 Answers

Use UseConfiguration directly to set url address populated by args:

public static IWebHost BuildWebHost(string[] args)
{
        var config = new ConfigurationBuilder().AddCommandLine(args).Build();

        return WebHost.CreateDefaultBuilder(args)
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .Build();
}

And we should not add any other code in Program.cs file, cause CreateDefaultBuilder is contain addCommandLine. for more detail, you can see WebHost.cs#L177

This is not exactly true, as linked CreateDefaultBuilder implementation uses ConfigureAppConfiguration method, not UseConfiguration. And there is a difference (from related Github issue):

The ConfigureAppConfiguration was intended to configure the IConfiguration in the application services whereas UseConfiguration is intended to configure the settings of the WebHostBuilder. Since the url address is a setting on the WebHostBuilder only UseConfiguration will work here.

Note that the WebHostBuilder's configuration is added to the application's configuration but the converse is not true; configuring the application's configuration does not affect the WebHostBuilder's configuration.

like image 93
Set Avatar answered Oct 21 '22 02:10

Set