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

ca9*_*3d9 9 c# .net-core asp.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")
            ......
Run Code Online (Sandbox Code Playgroud)

我不想硬编码端口号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();
}
Run Code Online (Sandbox Code Playgroud)

Set*_*Set 7

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

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>);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

"server.urls": "http://*:5000"
Run Code Online (Sandbox Code Playgroud)

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

dotnet run --server.urls=http://0.0.0.0:5001
Run Code Online (Sandbox Code Playgroud)


Cha*_*der 5

读取上面 @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();
}
Run Code Online (Sandbox Code Playgroud)

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