使用配置文件中的设置`UseUrl(...)`?

时间:2016-09-19 18:07:30

标签: c# asp.net-core .net-core

我有一个带有以下代码的Asp.net核心应用程序。

Program.cs的

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseUrls("http://*:5000")
            ......

我不想硬编码端口号5000.如何从配置文件中读取它?

startup.cs使用配置文件进行某些设置。代码是否应该在program.cs中重复?但是如何获得IHostingEnvironment env

Startup.cs

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

3 个答案:

答案 0 :(得分:6)

可以在main方法中创建IConfiguration的实例,并将其用于主机配置。而且你可以直接我们

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

    var host = new WebHostBuilder()
            .UseUrls(<values from config>);
}

此外,您可以直接使用.UseConfiguration(config)扩展方法:

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

在这种情况下,配置文件应该有'server.urls'参数。对于你的情况:

"server.urls": "http://*:5000"

另请注意,当您直接运行应用程序时,可以从命令行传递端口:

dotnet run --server.urls=http://0.0.0.0:5001

答案 1 :(得分:3)

读取上面@Set提到的配置值,但在CreateHostBuilder()中使用它对于WebHost来说是有效的。

private static string GetHostPort()
{
    var config = new ConfigurationBuilder()
        .AddJsonFile(SelfHostSettings, optional: false, reloadOnChange: false)
        .Build();

    return config["HostPort"] ?? "8080";
}

private static IHostBuilder CreateHostBuilder(string[] args)
{
    var hostPort = GetHostPort();

    return Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(GetConfig)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseUrls($"http://localhost:{hostPort}");
            webBuilder.UseStartup<Startup>();
        })
        .UseWindowsService();
}

请注意,尝试从Main()读取配置会将目录默认为%windir%\system32,但从CreateHostBuilder()调用的目录将设置为应用程序目录。

答案 2 :(得分:0)

覆盖Urls(在端口5020上监听):

$ dotnet run --urls=http://*:5020

http / https:

$ dotnet run --urls="http://*:5020;https://*:5021"