使用配置文件中的“UseUrl(..)”设置

本文关键字:设置 UseUrl 配置文件 | 更新日期: 2023-09-27 18:07:49

我有一个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();
}

使用配置文件中的“UseUrl(..)”设置

可以在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. conf"。url参数。对于您的情况:

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

还需要注意的是,当你直接运行app时,你可以通过命令行传递port:

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

读取配置值如上面提到的@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()调用相同的目录被设置为应用程序目录。

覆盖url(监听端口5020):

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

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

您可以通过Kestrel选项设置url:

Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(hostBuilder =>
    {
        hostBuilder.UseKestrel((builderContext, kestrelOptions) =>
        {
            kestrelOptions.ListenAnyIP(builderContext.Configuration.GetValue<int>("Port"));
        });
    }
);

可以看到,您可以通过构建器上下文访问配置,并从中获取任何信息。包括端口。