【问题标题】:Overriding appsettings values in asp.net core覆盖 asp.net 核心中的 appsettings 值
【发布时间】:2019-05-18 11:39:03
【问题描述】:

我通过在 azure 门户中配置它们来覆盖 appsettings.json 文件中设置的值。 为此,我进行了以下更改,除了调试代码时,这些更改都可以正常工作。

Startup.cs

public Startup(IConfiguration configuration, IHostingEnvironment env)
{
    Configuration = configuration;

    IConfigurationBuilder builder = new ConfigurationBuilder();

    builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

    builder.AddEnvironmentVariables();

    Configuration = builder.Build();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    DBContext.ConnectionString = Configuration.GetConnectionString("Connectionstr");
    Constants.AppLogicURI = Configuration["MailUri:LogicAppUri"];
    Constants.BlobStorageKey = Configuration["BlobKey:BlobStorageKey"];
    Constants.BlobStorageConnectionString = Configuration["BlobConnectionString:BlobStorageConnectionString"];
    Constants.BlobUri = Configuration["Uri:BlobUri"];
    Constants.StorageAccount = Configuration["AccountName:StorageAccount"];
}

当我调试我的代码时,由于应用程序无法启动,我没有从 appsettings.json 文件中获取任何值。

如果我注释掉 Configuration = builder.Build(); 行,我只会得到值

不知道为什么我需要这样做以及如何解决这个问题。

【问题讨论】:

    标签: c# azure asp.net-core asp.net-core-webapi


    【解决方案1】:

    您不需要自己构建配置,当您在 Program.cs 中调用 WebHost.CreateDefaultBuilder(...) 时,.NET Core 代码会为您完成。

    .NET Core 将配置不同的提供者,例如Azure 保管库、JSON 文件、环境变量、命令行等。

    Startup 中你唯一需要的想法是

    Configuration = configuration;
    

    您已经在 Startup 方法的顶部有这个,这就是当您注释掉 Configuration = builder.build(); 代码时它起作用的原因。

    您可以在Configuration documentation 中找到有关不同 Provider 和读取变量顺序的更多信息。

    编辑

    文档显示了 .NET Core 自动为您添加的提供程序的顺序。提供者部分的最后一句话说:

    当您初始化一个新的 带有CreateDefaultBuilder 的 WebHostBuilder。有关详细信息,请参阅 Web Host: Set up a host.

    查看CreateDefaultBuilder 的链接,因为它还解释了该方法默认为您配置的内容。

    【讨论】:

    • 所以你的意思是只评论那一行,如果部署了 web api,它也会覆盖 azure 中的设置。
    • 没有。您应该从Startup 中删除除第一行之外的所有代码,因为.NET Core 会为您执行AddJsonFileAddEnvironmentVariables(以及包括AzureVault 在内的其他一些代码)。查看答案中的文档链接。阅读链接指向的所有部分,它应该更有意义。
    • 是的 我仍然不清楚..这意味着我需要在 Program.cs 文件而不是 Startup.cs 中进行配置?如果是这样,那么 azure 环境变量将如何被它覆盖?我指的是这个链接stackoverflow.com/questions/45298562/…
    【解决方案2】:

    改变

    Configuration["BlobKey:BlobStorageKey"];

    Configuration.GetSection("BlobKey:BlobStorageKey");

    因为ConfigurationStartup.Configuration 并且你在Program.cs 中有Build() 所以你需要注释掉Configuration = builder.Build();

    【讨论】:

      【解决方案3】:

      您的appsettings.json 文件未被读取的原因是您没有在ConfigurationBuilder 上调用SetBasePath。这通常使用WebHost.CreateDefaultBuilder 中的Directory.GetCurrentDirectory() 为您处理,而Program.cs 中使用了它本身。

      虽然您可以在 Startup 构造函数中调用 SetBasePath,但是当您可以使用传入的 IConfiguration 时,没有真正的理由创建自己的 IConfiguration 实例。此实例已配置已经从appsettings.json 和环境变量中读取both,环境变量覆盖appsettings.json 中指定的那些。

      您在 Azure 门户的“应用程序设置”和“连接字符串”部分中指定的任何设置都将覆盖您在 appsettings.json 文件中指定的设置,因为它们作为环境变量添加到 Azure 环境中。

      【讨论】:

      • 所以你说我不应该在启动构造器中保留任何东西,除了配置单行。此外,通过在 azure 门户中进行设置,它将自动覆盖这些 appsettings 值。如果我错了,请纠正我。您能否提供任何相同的示例/伪代码?
      • 没错 - 您在构造函数中只需要 Configuration = configuration; - 这将允许 Azure 门户设置覆盖 appsettings.json 值。您能否更具体地说明您要查找的示例代码?
      • 我只想通过在 azure 门户中设置应用设置和连接字符串来覆盖 appsettings 值。因为我需要根据环境在 azure 上配置这些设置。这就是它的全部目标。
      • 这就是这个设置会发生的事情。不需要额外的代码。
      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多