如何从appsettings.json文件中获取ConnectionString?

3

问题是如何在ASP NET Core 3.1应用程序中从appsetting.json文件获取ConnectionString?以下是appsetings.json文件

"ConnectionStrings": {
"DefaultConnection": "data source=exmaple;initial catalog=example;persist security info=True;user id=example;password=example"
}

在这个例子中,所有的参数都隐藏在名为example的名称后面。
在Program.cs类中,我包括文件。
static void ConfigureAppConfiguration(WebHostBuilderContext context, IConfigurationBuilder config, string[] args)
{
    config
         .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
         .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName.ToLowerInvariant()}.json", optional: true, reloadOnChange: true)
         .AddEnvironmentVariables()
         .AddCommandLine(args);
}

当我尝试在启动类中获取连接字符串的值时,我得到了null

public void ConfigureServices(IServiceCollection services)
{
    var connetctionString = config.GetConnectionString("DefaultConnection");
    ...
}

为什么连接为 null?

你在哪里和如何使用这个 ConfigureAppConfiguration - undefined
由于其他答案未能解决您的问题,可能是路径问题。请检查文件是否正确复制到输出目录(在调试模式下类似于Debug/bin/)。如果没有,请打开文件属性并选择“如果较新则复制”或“始终复制”在构建操作中。 - undefined
3个回答

4

除了之前的回答,您还可以在Startup.cs中使用您所使用的方法,这样它会看起来像下面这样:

    public IConfiguration Configuration { get; }
    public Startup(IConfiguration configuration)
    {
          Configuration = configuration;
    }
    
            
    public void ConfigureServices(IServiceCollection services)
    {
        var connectionString = Configuration.GetConnectionString("DefaultConnection");
    }

还应该注意,您不需要在Program.cs中显式指定配置文件。 您也可以使用Host.CreateDefaultBuilder方法,它会自动添加这些文件。


1

这是一个演示:

启动:

public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
    {
        var connetctionString = Configuration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;

appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "data source=exmaple;initial catalog=example;persist security info=True;user id=example;password=example"
  }
}

结果: 在此输入图像描述

更新:

Program.cs:

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config
               .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
               .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName.ToLowerInvariant()}.json", optional: true, reloadOnChange: true)
               .AddEnvironmentVariables()
               .AddCommandLine(args);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

如果你想在 program.cs 中设置配置,可以参考官方文档,并在 public static IHostBuilder CreateHostBuilder(string[] args) 中进行设置。

奇怪的是,尽管调试持续进行,但我仍然得到空值。 - undefined
尝试在program.cs中按照我在答案中更新的方式进行配置,能行吗? - undefined
2
GetConnectionString是一个扩展方法,方便地根据连接字符串设置的默认(标准)名称获取连接字符串。它基本上与GetSection("ConnectionStrings").GetSection("DefaultConnection").Value相同,或者更简单地使用GetValue<string>("ConnectionStrings:DefaultConnection") - undefined

0
你可以这样做
var connectionString = Configuration.GetConnectionString("DefaultConnection");

但是如果你的目标是覆盖appsettings.json,这里有一个小指南

默认顺序是1)appsettings.json,2)appsettings.{env}.json,3)secrets.json,4)环境变量,5)控制台参数。这意味着你在第2个位置覆盖的任何内容都会影响到第1个位置等等。因此,如果存在设置,你的程序会按照相反的顺序查找设置。如果你想改变这个顺序,可以按照以下步骤进行操作:

在Program类中的CreateHostBuilder方法的.ConfigureAppConfiguration中进行如下操作:

IHostEnvironment env = hostingContext.HostingEnvironment;
builder.Sources.Clear();

//Now the first in order became the #2 of defaults
builder.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
 
if (hostingContext.HostingEnvironment.IsDevelopment())
{
    builder.AddUserSecrets<Program>();
}
builder.AddEnvironmentVariables();
builder.AddCommandLine(args);

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