【问题标题】:How to get ConnectionString from appsettings.json file?如何从 appsettings.json 文件中获取 ConnectionString?
【发布时间】:2021-02-19 13:48:30
【问题描述】:

问题是如何从 ASP NET Core 3.1 应用程序的 appsetting.json 文件中获取 ConnectionString? 这是 appsettings.json 文件

"ConnectionStrings": {
"DefaultConnection": "data source=exmaple;initial catalog=example;persist security info=True;user id=example;password=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);
}

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

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

为什么连接 == null ?

【问题讨论】:

  • 你在哪里以及如何使用这个ConfigureAppConfiguration
  • 由于其他答案未能解决您的问题,这听起来像是路径问题。检查文件是否正确复制到输出目录中(类似于调试模式下的 Debug/bin/)。如果没有,请打开文件的属性并在 Build Actions 上选择“Copy if newer”或“Copy always”。

标签: c# asp.net-core


【解决方案1】:

除了上一个答案,您还可以在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-method,它会自动添加文件。

【讨论】:

    【解决方案2】:

    这是一个演示:

    启动:

    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"
      }
    }
    

    结果:

    更新:

    程序.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中设置配置,可以参考official doc,在public static IHostBuilder CreateHostBuilder(string[] args)中设置。

    【讨论】:

    • 奇怪,但调试仍然存在时我仍然有 null
    • 尝试在我的答案中更新时在 program.cs 中设置配置,它可以工作吗?
    • GetConnectionString是一种扩展方法,可以方便地根据连接字符串设置的默认(标准)名称获取连接字符串,它与GetSection("ConnectionStrings").GetSection("DefaultConnection").Value基本相同或更简单GetValue&lt;string&gt;("ConnectionStrings:DefaultConnection")跨度>
    【解决方案3】:

    你可以这样做

    var connectionString = Configuration.GetConnectionString("DefaultConnection");
    

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

    默认顺序是 1) appsettings.json, 2) appsettings.{env}.json, 3) secrets.json, 4) 环境变量, 5) 控制台参数。这意味着您在 num 2 中所覆盖的任何内容都会对数字 1 等产生影响。因此,如果有任何设置,您的程序会以相反的顺序查找设置。如果您想更改此顺序,您可以执行以下操作:

    在 .ConfigureAppConiguration 中 CreateHostBuilder 内的 Program 类中

    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);
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多