【发布时间】:2020-04-17 01:33:27
【问题描述】:
我有一个应用程序将使用我构建的一些外部微服务。应用程序和微服务托管在 Azure 应用服务上。 Startup 类中需要微服务的功能,因此我提前注册了这些依赖项(在创建 IWebHostBuilder 时)。微服务还依赖于配置值(由应用程序提供),所以我还在创建IWebHostBuilder 以从appsettings.json 获取设置时进行一些IOptions 模式配置。该设置文件包含将在所有环境中使用的设置,以及一些特定于环境的设置。我打算使用文件中的设置进行本地开发,并使用应用服务上的配置刀片覆盖特定于环境的设置。在我构建的其他应用程序中,配置刀片设置确实覆盖了来自appsettings.json 的值。
但是,当您进行早期配置时,如以下代码所示,应用服务似乎无法覆盖设置,因此我的本地开发设置最终被应用服务中使用(所以一切都失败了向上)。我在黑暗中拍摄了一张照片,并将特定于环境的设置从appsettings.json 中移出,并移到了它们自己的具有不同名称的 JSON 文件中。现在我只是提前加载那个文件。这并没有解决我的问题。
所以我的问题是,有哪些技术可以在 Startup 之前提供配置设置,但仍然能够覆盖 Azure 应用服务中的这些设置?我已经浏览了有关配置的 .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");
}
}
【问题讨论】:
-
这确实很棘手,但是这种情况需要这样做吗?也许如果你分享一些关于更大流程的更多细节,以及这样做的必要性,可能会有替代解决方案
-
在启动过程中访问 blob 存储是否为时过早?
-
请阅读这篇文章,我认为这对你很有用。 (stackoverflow.com/questions/52684767/…)
-
@PatrickGoode - 我们的应用程序通常需要一些早期的服务注册,因为我们的 Startup 类基于 AAD(通过 Graph)和自定义 RBAC 系统中的信息构建了许多授权策略。我们尽早注册这些依赖项,以便 Startup 可以构建策略。
-
@Jason - 谢谢。我正在经历它,并试图提取对我有用的东西。你有一个特定的部分吗?我之所以问,是因为有些垃圾响应和一些有意义的响应是不同的方法。
标签: azure asp.net-core .net-core azure-web-app-service