如何在.NET 6控制台应用程序中读取appsettings.json文件?

65

我尝试创建一个.NET 6控制台应用程序,但在读取我的appsettings.json文件时遇到了麻烦。在Web应用程序中,我可以使用以下方法...

var builder = WebApplication.CreateBuilder(args);

但是在控制台应用程序中我要使用什么呢?当我尝试将它添加到program.cs文件时,我遇到了以下错误:"The name 'WebApplication' does not exist in the current context"


1
请查看此链接:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0 - Samy Sammour
只需将 Json 文件添加到配置中:Configuration.AddJson("appsetting.json"); - Mohammad Azizkhani
1
只提到像我上面所说的Web应用程序。 - MTplus
希望您能从以下链接中获得帮助: https://dev59.com/QsXsa4cB1Zd3GeqPZk63 - Subarata Talukder
看看这个答案:https://stackoverflow.com/a/70242856/1977871。 - undefined
8个回答

82

1
我尝试了你的方法,但是不起作用。我收到了“在当前上下文中不存在'builder'名称”的错误? - MTplus
它将是configuration.Build(); 我在我的代码中进行了更正。 - Amit Kotha
2
在构建时不要忘记包括 appsettings.json (属性 -> 复制到输出目录)。 - rlv-dan
3
不需要两个NuGet包,只需要使用Microsoft.Extensions.Configuration.Json,因为该包已经隐式地使用了Microsoft.Extensions.Configuration - Pure.Krome
我出现了错误: System.IO.FileNotFoundException:“找不到配置文件'appsettings.json',且它不是可选项。预期的物理路径为'C:\work\CheckerHistory\CheckerHistory\CheckerHistory\bin\Debug\net7.0\appsettings.json'。” 但在构建时包括appsettings.json(属性->复制到输出目录)可以解决问题。 - mathewsun

30

文档链接:https://learn.microsoft.com/en-us/dotnet/core/extensions/configuration

需要使用Nuget包完成此操作:

<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="6.0.0" />

使用 Microsoft.Extensions.Configuration;

    // Build a config object, using env vars and JSON providers.
    IConfiguration config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddEnvironmentVariables()
        .Build();
    
    // Get values from the config, given their key and their target type.
    Settings settings = config.GetRequiredSection("Settings").Get<Settings>();
    
    // Write the values to the console.
    Console.WriteLine($"KeyOne = {settings.KeyOne}");
    Console.WriteLine($"KeyTwo = {settings.KeyTwo}");
    Console.WriteLine($"KeyThree:Message = {settings.KeyThree.Message}");

// Application code which might rely on the config could start here.
// This will output the following:
//   KeyOne = 1
//   KeyTwo = True
//   KeyThree:Message = Oh, that's nice...

JSON文件(appsettings.json)

{
    "Settings": {
        "KeyOne": 1,
        "KeyTwo": true,
        "KeyThree": {
            "Message": "Oh, that's nice..."
        }
    }
}

更新:我检查了这种方法,它有效;我的代码:

UPD: 我检查了这个方法,并且它有效;我的代码:

// See https://aka.ms/new-console-template for more information

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;

Console.WriteLine("Hello, World!");
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
IConfiguration c = configurationBuilder.AddJsonFile("appsettings.json").AddEnvironmentVariables().Build();
var k = c.GetRequiredSection("Settings").Get<Settings>().KeyOne;
var n = 1;

public class NestedSettings
{
    public string Message { get; set; } = null!;
}
public class Settings
{
    public int KeyOne { get; set; }
    public bool KeyTwo { get; set; }
    public NestedSettings KeyThree { get; set; } = null!;
}





17

使用 .NET 6 控制台应用程序,尝试:

using IHost host = Host.CreateDefaultBuilder(args).Build();

IConfiguration config = host.Services.GetRequiredService<IConfiguration>();

string con= config.GetValue<string>("ConnectionStrings:conn1");
//OR
string connectionString = config["ConnectionStrings:conn1"];

Console.WriteLine($"Hello, World! {connectionString}");

appsettings.json(属性):(CopyToOutputDirectory = Always):

"ConnectionStrings": {
    "conn1": "Server=localhost;Database=MyDatabase;Trusted_Connection=True", 
  }

我有点困惑为什么这个被接受但不流行,以及它如何没有引用JSON文件名。 - Mr. Boy
同时,我认为像这样的秘密信息不应该包含在JSON文件中(尤其是如果它被检入源代码控制)。因此,用户机密信息就可以派上用场了。 - Rippo
1
在桌面应用程序或控制台应用程序中,Host 是什么? - Kiquenet
@Mr.Boy 如果你也在使用 Host.CreateApplicationBuilder() 进行依赖注入的话,你可以使用这个答案来通过 host.Services.GetRequiredService<IConfiguration>() 获取 IConfiguration。否则,你可以使用另一个答案,它使用 ConfigurationBuilder - undefined

6
在控制台应用程序中,我像这样添加 appsettings.jsonuser secrets,你也可能有一个开发的json文件。
internal class Program
{
    internal static IConfigurationRoot Configuration;

    public static void Main()
        => new Program().MainAsync().GetAwaiter().GetResult();

    private async Task MainAsync()
    {
        var configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        configurationBuilder.AddUserSecrets(typeof(Program).GetTypeInfo().Assembly, optional: false);
        Configuration = configurationBuilder.Build();

        ...
    }
}

然后在控制台应用程序的其他类中,您可以像这样简单地调用它

var someSetting = Program.Configuration["SomeSetting"];

如果您想要一个强类型的类,请参考这个答案:.net core控制台应用程序的强类型配置在SO上。

2
Main method supports async Task, my advice is to don't use GetAwaiter().GetResult() - Krusty
好的,谢谢。 - Rippo

4
我更倾向于以下代码,因为它会自动从项目目录中读取appsettings.json文件。在配置DbContext以读取连接字符串时,请注意我使用的_.Configuration
var builder = Host.CreateDefaultBuilder(args)
        .ConfigureServices(
                (_, services) => services
                    .AddTransient<IService, Service>()
                    .AddDbContext<ApplicationDbContext>(options =>
                        options.UseNpgsql(
                      _.Configuration.GetConnectionString("DefaultConnection"),
                            b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName)))
                    );
var host = builder.Build();


var dbContext = host.Services.GetRequiredService<ApplicationDbContext>();

我从这个链接中整理了以下内容:https://bjdejongblog.nl/net-core-6-dependency-injection-console-program/


如何在库类依赖中使用_configuration_? - Kiquenet

1
安装以下软件包。
Install-Package Microsoft.Extensions.Configuration.Json
Install-Package Microsoft.Extensions.Hosting

创建一个名为appsettings.json的文件。
{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "defaultConnection": "data source=.;initial catalog=ExchangeGatewayDb;integrated security=true;MultipleActiveResultSets=True;"
  }
}

将此代码添加到 Programe.cs 文件中。
var hostBuilder = new HostBuilder().ConfigureHostConfiguration(config =>
        {
            config.AddEnvironmentVariables();

            if (args != null)
            {
                config.AddCommandLine(args);
            }
        }).ConfigureAppConfiguration((context, builder) =>
        {
            var env = context.HostingEnvironment;
            builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true).AddEnvironmentVariables();

            var configuration = builder.Build();
            var connectionString = configuration["ConnectionStrings:defaultConnection"];
        }).ConfigureServices(services =>
        {
            services.Configure<ConsoleLifetimeOptions>(opts => opts.SuppressStatusMessages = true);
            //your code
        });

var buildHost = hostBuilder.Build();
buildHost.Run();

尝试过这个,但程序总是卡在buildHost.Run()上。 - Esko
你应该在ConfigureServices方法中执行你的操作。 - Diako Hasani
如果您创建一个新的 .NET 6 控制台应用程序,那么就没有 ConfigureServices 方法。 - Esko
@esko 如何在Net 6控制台中使用? - Kiquenet

0
你需要创建一个名为appSetting.json的文件,并设置属性Copy Output Directory - copy always
2.按照以下代码编写。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MidcapERP.Kafka.Configurations;
using MidcapERP.Kafka.Services;

await CreateHostBuilder(args).RunConsoleAsync();

static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
    .ConfigureLogging((hostContext, builder) =>
    {
        builder.ClearProviders(); // This line is optional if you want to clear the default logging providers
        builder.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
        builder.AddConsole();
        builder.AddDebug();
        builder.AddEventSourceLogger();
        builder.SetMinimumLevel(LogLevel.Warning);
    })
    .ConfigureServices((hostContext, services) =>
    {
        services.AddOptions();
        services.Configure<KafkaConfiguration>(hostContext.Configuration.GetSection(nameof(KafkaConfiguration)));
        services.AddHostedService<KafkaConsumerService>();
    })
    .UseConsoleLifetime(); // This line should be the last one


0
我在我的库中使用,在类中:
         public static IConfigurationRoot GetIConfigurationRoot(string outputPath = null)
        {
            var path1 = Directory.GetCurrentDirectory();
            //_configuration =
            var config = new ConfigurationBuilder()
                .SetBasePath(path1)
                .AddJsonFile("appsettings.json").Build();
            return config;
            //return new ConfigurationBuilder()
            //    .SetBasePath(outputPath)
            //    .AddJsonFile("appsettings.json", optional: true)
            //    //.AddUserSecrets("e3dfcccf-0cb3-423a-b302-e3e92e95c128")
            //    .AddEnvironmentVariables()
            //    .Build();
        }

        public static string CONEXION_SQL
        {
            get
            {
                var config = GetIConfigurationRoot();
                return config.GetConnectionString(KeyConexionMyApp);
                //return ConfigurationManager.ConnectionStrings[KeyConexionMyApp].ConnectionString;
            }
        }

用法:

var myConnectionSQL = ConfigMyApp.CONEXION_SQL;

使用静态构造函数:

public static partial class ConfigMyApp
{
    static readonly IConfigurationRoot config;
    static ConfigMyApp()
    {
        config = GetIConfigurationRoot();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接