我有一个应用程序,它将使用我构建的一些外部微服务。该应用程序和微服务托管在Azure App Services上。在Startup
类中需要微服务的功能,因此我正在尽早注册这些依赖项(在创建IWebHostBuilder
时)。微服务还取决于配置值(由应用程序提供),因此在创建IOptions
以从IWebHostBuilder
获取设置的同时,我也在进行appsettings.json
模式配置。该设置文件包含将在所有环境中使用的设置,以及一些特定于环境的设置。我打算使用文件中的设置进行本地开发,并使用App Service上的“配置”刀片覆盖特定于环境的设置。在我构建的其他应用程序中,“配置”刀片服务器设置的确覆盖了appsettings.json
中的值。
[但是,当您进行早期配置时,如下面的代码所示,App Service无法覆盖设置,因此最终我的本地开发设置最终在App Service中使用(因此,所有操作都崩溃了)。我在黑暗中拍照,并将特定于环境的设置从appsettings.json
中移出,并使用不同的名称移入了自己的JSON文件。现在,我只是尽早加载该文件。这没有解决我的问题。
所以我的问题是,在Startup
之前有哪些可用的配置设置,但仍然能够覆盖Azure App Services中的设置?我搜寻了有关.NET Core配置的文档,但是有太多的选择和方法使它们困扰我。我目前正在使用.NET Core 2.2。预先感谢!
internal static class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args)
.Build()
.Run();
}
private static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) => { builder.AddEarlyRequiredConfiguration(); })
.ConfigureServices((context, services) => { services.AddEarlyRequiredServices(context); })
.UseStartup<Startup>();
}
private static void AddEarlyRequiredServices(this IServiceCollection services, WebHostBuilderContext context)
{
// This extension method is in a separate assembly, and registers the microservices.
// It also configures the IOptions stuff for the configuration values.
services.AddMyMicroservices(context);
}
private static void AddEarlyRequiredConfiguration(this IConfigurationBuilder builder)
{
builder.AddJsonFile("appsettings.json");
}
}
如果有一个答案,请随时发布更好的答案。这可能并不完美,但这是我最终处理它的方式。
我以建议的appsettings.{Environment}.json
格式创建设置文件。我没有使用Microsoft开箱即用的环境名称(开发,登台,生产)。相反,我根据组织环境对它们进行了自定义。在launchSettings.json
中,我为ASPNETCORE_ENVIRONMENT
环境变量设置了一个值,该值指示我的本地开发环境。在App Services上,我将同一环境变量设置为具有与这些环境相关的值。由于早期注册时appsettings.json
中的所有内容都将被[[not覆盖,因此我将需要覆盖的所有设置都放入了这些环境特定的文件中。我只想在App Service配置中指定的任何设置,我都完全忽略了设置文件。最后,我更改了早期注册方法,如下所示:
private static void AddEarlyRequiredConfiguration(
this IConfigurationBuilder builder,
WebHostBuilderContext context)
{
builder.AddJsonFile("appsettings.json");
builder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json");
}
}
我只是确保在appsettings.json
,appsettings.{Environment}.json
和App Service配置之间,没有重复的设置。这样,我就可以根据需要尽早注册设置,但是这三层中的任何一层都不必覆盖。