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

MTp*_*lus 69 c# json console-application .net-6.0

我尝试创建 .NET 6 控制台应用程序,但在读取 appsettings.json 文件时遇到问题。在网络应用程序中我可以使用这个......

var builder = WebApplication.CreateBuilder(args);
Run Code Online (Sandbox Code Playgroud)

但我会在控制台应用程序中使用什么?尝试将其添加到 program.cs 时出现此错误。"The name 'WebApplication' does not exist in the current context"

小智 89

将这两个 nuget 包添加到您的应用程序中

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.Json
Run Code Online (Sandbox Code Playgroud)

然后就可以ConfigurationBuilder使用appsettings.json文件了

var configuration =  new ConfigurationBuilder()
     .AddJsonFile($"appsettings.json");
            
var config = configuration.Build();
var connectionString = config.GetConnectionString("ConnectionString");
Run Code Online (Sandbox Code Playgroud)

从控制台应用程序中的 AppSettings 获取值

在.net core应用程序中添加AppSettings

  • 构建时不要忘记包含 appsettings.json(属性 -> 复制到输出目录) (3认同)
  • 不需要两个金块。只是“Microsoft.Extensions.Configuration.Json”,因为该包已经隐式使用“Microsoft.Extensions.Configuration” (3认同)

小智 35

链接到文档: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" />
Run Code Online (Sandbox Code Playgroud)

使用 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...

Run Code Online (Sandbox Code Playgroud)

JSON 文件 (appsettings.json)

{
    "Settings": {
        "KeyOne": 1,
        "KeyTwo": true,
        "KeyThree": {
            "Message": "Oh, that's nice..."
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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!;
}




Run Code Online (Sandbox Code Playgroud)


Red*_*Red 18

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

appsettings.json(属性):(CopyToOutputDirectory = 始终):

"ConnectionStrings": {
    "conn1": "Server=localhost;Database=MyDatabase;Trusted_Connection=True", 
  }
Run Code Online (Sandbox Code Playgroud)


Rip*_*ppo 6

在控制台应用程序中,我添加了appsettings.json,像user 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();

        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var someSetting = Program.Configuration["SomeSetting"];
Run Code Online (Sandbox Code Playgroud)

如果您想要一个强类型类,请参阅此答案.net core Console applicationstrongly typed Configuration on SO

  • `Main` 方法支持 `async Task`,我的建议是不要使用 `GetAwaiter().GetResult()` (2认同)