在ASP.NET Core中覆盖appsettings的值

3
我可以帮您翻译成中文。以下是需要翻译的内容:

我正在通过在 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();这一行时,我才能获得这些值。

不确定为什么需要这样做以及如何解决此问题。

3个回答

3
你的 appsettings.json 文件没有被读取的原因是你没有在 ConfigurationBuilder 上调用 SetBasePath。通常情况下,Directory.GetCurrentDirectory()WebHost.CreateDefaultBuilder 中使用,它本身被用在 Program.cs 中,已经为你处理好了。

虽然你可以在 Startup 构造函数中调用 SetBasePath,但实际上没有必要创建自己的 IConfiguration 实例,因为你可以直接使用传入的 IConfiguration 实例。这个实例已经配置好了从 两个 地方读取配置信息: appsettings.json 和环境变量,其中环境变量会覆盖 appsettings.json 中指定的内容。

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


那么你的意思是我不应该在启动构造函数中保留除配置单行之外的任何内容。此外,通过在 Azure 门户中进行设置,它将自动覆盖这些 appsettings 值。如果我错了,请纠正我。您能否提供任何示例/伪代码? - XamDev
1
没错 - 在你的构造函数中,你只需要写 Configuration = configuration; - 这样可以让 Azure 门户的设置覆盖 appsettings.json 中的值。你能具体说明一下你需要什么样的示例代码吗? - Kirk Larkin
我只想通过在Azure门户中设置应用程序设置和连接字符串来覆盖appsettings值。因为我需要根据环境在Azure上配置这些设置。这就是整个目的。 - XamDev
1
这就是当前设置的情况,不需要额外的代码。 - Kirk Larkin

1

更改

Configuration["BlobKey:BlobStorageKey"];

Configuration.GetSection("BlobKey:BlobStorageKey");

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

0

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

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

Startup中唯一需要的是

Configuration = configuration;

你已经在 Startup 方法的顶部拥有了这个,这就是为什么当你注释掉 Configuration = builder.build(); 代码时它可以工作。

你可以在 Configuration documentation 中了解更多关于不同提供程序和变量读取顺序的信息。

编辑

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

当你使用 CreateDefaultBuilder 初始化一个新的 WebHostBuilder 时,会放置这些提供程序的顺序。更多信息请参见 Web Host: Set up a host

请查看链接CreateDefaultBuilder,因为它还会解释该方法默认为您配置了什么。


你的意思是仅仅通过注释掉那一行代码就可以覆盖在 Azure 上部署的 Web API 的设置? - XamDev
1
不应该保留Startup中除第一行以外的所有代码,因为.NET Core会自动执行AddJsonFileAddEnvironmentVariables(以及其他一些包括AzureVault在内的操作)。请查看答案中的文档链接。阅读链接指向的部分,应该会更加清晰明了。 - Simply Ged
是的,我仍然不清楚...这意味着我需要在 Program.cs 文件中进行配置而不是 Startup.cs 吗?如果是这样,那么 Azure 环境变量将如何被覆盖?我正在参考此链接:https://dev59.com/AFcO5IYBdhLWcg3wvUMp - XamDev

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