【问题标题】:How Can I Get Early Access to Configuration in Azure App Service?如何提前访问 Azure 应用服务中的配置?
【发布时间】: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


【解决方案1】:

如果您有更好的答案,请随时发布。这可能并不完美,但这就是我最终处理它的方式。

我以appsettings.{Environment}.json 的建议形式创建了设置文件。我没有使用 Microsoft 开箱即用的环境名称(开发、暂存、生产)。相反,我将它们定制为我组织的环境。在launchSettings.json 中,我为ASPNETCORE_ENVIRONMENT 环境变量设置了一个值,用于指示我的本地开发环境。在 App Services 上,我设置了相同的环境变量以具有这些环境的相关值。由于appsettings.json 中的任何内容不会在提前注册时被覆盖,因此我将所有需要覆盖的设置放入那些环境特定的文件中。我只想在应用服务配置中指定的任何设置,我完全没有设置文件。最后,我把我的早期注册方式改成了这样:

private static void AddEarlyRequiredConfiguration(
        this IConfigurationBuilder builder,
        WebHostBuilderContext context)
    {
        builder.AddJsonFile("appsettings.json");
        builder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json");
    }
}

我只是确保在 appsettings.jsonappsettings.{Environment}.json 和应用服务配置之间没有重复设置。通过这种方式,我根据需要提前注册了设置,但是这三个层中的任何设置都不需要被覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多