读取主程序.cs中的appsettings.json

问题描述 投票:0回答:10

首先,我的主要目的是动态设置我的应用程序的 IP 和端口。

我正在使用

IConfiguration
注入 json 配置文件,就像提到的一些教程一样。

但是,我无法检索Program.cs中的配置,因为我的

WebHostBuilder
将同时使用StartUp和Url。

所以在主机建立时,我的配置中没有任何内容。

WebProtocolSettings settings_Web = new WebProtocolSettings();
var host = new WebHostBuilder()
                .UseIISIntegration()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .UseUrls(settings_Web.Url + ":" + settings_Web.Port)
                .Build();

在 Startup.cs 中

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

    Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; set; }

public void ConfigureServices(IServiceCollection services)
{
    // Adds services required for using options.
    services.AddOptions();

    var _WebProtocolSettings = Configuration.GetSection("WebProtocolSettings");

    // Register the IConfiguration instance
    services.Configure<WebProtocolSettings>(_WebProtocolSettings);
}

我的appsettings.json:

{
    "WebProtocolSettings": {
        "Url": "127.0.0.1",
        "Port": 5050
    }
}

我的 WebProtocolSettings.cs:

public class WebProtocolSettings
{
    public string Url { get; set; }
    public int Port { get; set; }
}
c# asp.net-core asp.net-core-1.0
10个回答
125
投票

在 .NET 6 中

var builder = WebApplication.CreateBuilder(args);

// Using the GetValue<type>(string key) method
var configValue = builder.Configuration.GetValue<string>("Authentication:CookieAuthentication:LoginPath");

// or using the index property (which always returns a string)
var configValue = builder.Configuration["Authentication:CookieAuthentication:LoginPath"];

113
投票

更新.Net 6

现在可以通过调用 GetValue(string key) 扩展方法轻松从 ConfigurationManager 获取任何设置。您还可以使用 Index(string key) 返回字符串。请参阅此答案


您必须在主方法中构建配置,获取该部分并将其绑定到您的模型。没有办法绕过它。

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

    WebProtocolSettings settings_Web = new WebProtocolSettings();
    config.GetSection("WebProtocolSettings").Bind(settings_Web);

    var host = new WebHostBuilder()
            .UseIISIntegration()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseUrls(settings_Web.Url + ":" + settings_Web.Port)
            .Build()

    host.Run();
}

##更新

另一种方法是将配置传递给

UseConfiguration
,如

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

    var host = new WebHostBuilder()
        .UseUrls("http://*:5000")
        .UseConfiguration(config)
        .UseKestrel()
        .Configure(app =>
        {
            app.Run(context => 
                context.Response.WriteAsync("Hello, World!"));
        })
        .Build();

    host.Run();
}

或在 ASP.NET Core > 2.0 中

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

public static IWebHost BuildWebHost(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", optional: true)
        .AddCommandLine(args)
        .Build();

    return WebHost.CreateDefaultBuilder(args)
        .UseUrls("http://*:5000")
        .UseConfiguration(config)
        .Configure(app =>
        {
            app.Run(context => 
                context.Response.WriteAsync("Hello, World!"));
        })
        .Build();
}

5
投票

.UseConfiguration
(Tseng 的替代答案)是最简单的方法,但请注意,以这种方式配置时,运行时对配置文件所做的更改不会应用于您的 IConfiguration 对象。为了保持配置动态,您必须使用
.ConfigureAppConfiguration
- 但随后您必须额外构建配置以便在
Main()
中使用。不过,您可以重复使用配置它的代码。

ASP.NET Core 2.2:

    public static void Main(string[] args)
    {
        IConfigurationBuilder configBuilderForMain = new ConfigurationBuilder();
        ConfigureConfiguration(configBuilderForMain);
        IConfiguration configForMain = configBuilderForMain.Build();

        // ... use configForMain to read config here ...

        var host = new WebHostBuilder()
            .ConfigureAppConfiguration(ConfigureConfiguration)
            // ... the rest of it ...
            .Build();
    }

    public static void ConfigureConfiguration(IConfigurationBuilder config)
    {
        config.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    }

4
投票

在asp.net core 3.1中,您可以通过

hostContext
访问配置。该示例基于工人服务项目:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    //Access configuration here with the Host Context.  For example, to get a connection string from AppSettings.json:
                    var connectionString = hostContext.Configuration.GetConnectionString("MyConnectionString");
                    services.AddHostedService<Worker>();
                });
    }

3
投票

一个老问题有一些新答案,所以这就是我喜欢这样做的方式。

  1. 在 appsettings.json 中定义配置

         "ServiceConfig": { "PortNumber": 5005 },
    
  2. 为配置创建一个类:

         public class ServiceConfig
         {
             private readonly IConfiguration configuration;
             public const string SectionName = "ServiceConfig";
             public ServiceConfig(IConfiguration config)
             {
                 configuration = config;            
                 configuration.GetSection(SectionName).Bind(this);            
             }
             public int PortNumber { get; set; }
         }
    
  3. 在Program.cs中使用配置:

         var config = new ServiceConfig(builder.Configuration);
         builder.WebHost.UseUrls($"http://*:{config.PortNumber}");
    

此方法还有一个额外的好处,即也可以用作依赖注入的服务:

         builder.Services.AddSingleton<ServiceConfig>();

2
投票

在 .NET 7 中,您需要使用

BuildServiceProvider()

所以你的

program.cs
的顶部看起来像这样;

var builder = WebApplication.CreateBuilder(args);
var provider = builder.Services.BuildServiceProvider();
var _configuration = provider.GetRequiredService<IConfiguration>();

然后您可以像这样访问您的

appsettings.json
值;

var configVal = _configuration.GetSection("Foo").GetValue<string>("Bar");

1
投票

支持命令行参数和默认应用程序设置文件的方法:

public static class Configuration
{
    public static IConfigurationRoot BuildConfigurationRoot()
    {

        var args = Environment.GetCommandLineArgs();
        var envArg = Array.IndexOf(args, "--environment");
        var envFromArgs = envArg >= 0 ? args[envArg + 1] : null;

        var aspnetcore = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        var dotnetcore = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");

        var environment = envFromArgs ?? (string.IsNullOrWhiteSpace(aspnetcore)
            ? dotnetcore
            : aspnetcore);

        var configuration = new ConfigurationBuilder()
            .AddCommandLine(Environment.GetCommandLineArgs())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile(
                $"appsettings.{environment}.json",
                optional: true)
            .Build();

        return configuration; 
    }
}

0
投票

.NET 8

给定

appsettings.json
文件:

{
  "MySettings": {
    "Name": "Bob",
    "Counter": "100",
  }
}

MySettings
类:

public class MySettings
{
    public string? Name { get; set; }
    public int? Counter { get; set; }
}

读取

Program.cs
文件中的这些值:

var builder = WebApplication.CreateBuilder(args);
var mySettings = new MySettings();
builder.Configuration.GetRequiredSection(nameof(MySettings)).Bind(mySettings);

var name = mySettings.Name; // Bob
var counter = mySettings.Counter; // 100

-3
投票

在.net core 3.1中,您可以使用ConfigurationHelper.GetConfiguration()来获取appSetting变量:

appSettings.json

"Endpoint": {
"ip": "170.888.88.888",
"port": 88888}

程序.cs

public class Program
{
    public static void Main(string[] args)
    {
     var config = ConfigurationHelper.GetConfiguration();
     var ip = config["Endpoint:ip"];
     var port = config["Endpoint:port"];
    }
 }

-4
投票

使用此代码:

public class Program
{
    private static string _environmentName;

    public static void Main(string[] args)
    {
        var webHost = BuildWebHost(args);

        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile($"appsettings.{_environmentName}.json", optional: true, reloadOnChange: true)
            .AddCommandLine(args)
            .Build();

        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, config) =>
    {
        config.ClearProviders();
        _environmentName = hostingContext.HostingEnvironment.EnvironmentName;
    }).UseStartup<Startup>().Build();
}
© www.soinside.com 2019 - 2024. All rights reserved.