首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当尝试使用环境变量作为配置源时,容器式Azure函数(v4,dotnet-isolated)中断。

当尝试使用环境变量作为配置源时,容器式Azure函数(v4,dotnet-isolated)中断。
EN

Stack Overflow用户
提问于 2022-05-18 14:24:22
回答 1查看 443关注 0票数 1

这是从前一个问题开始的。我正在尝试构建一个Azure函数,使用函数运行时的.NET 6和v4在一个孤立的进程中作为一个Linux容器映像运行。

我遵循了微软指南来获得一个工作的、正在运行的带有HTTP触发器的样例函数。然后,我开始了将我的代码添加到应用程序中的过程,并立即被阻止。这是我的Main Program方法

代码语言:javascript
复制
public static void Main()
{
    var host = new HostBuilder()
        .ConfigureFunctionsWorkerDefaults()
        .ConfigureAppConfiguration((context, builder) =>
        {
            builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
            builder.AddEnvironmentVariables();
        })
        .ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration))
        .Build();

    host.Run();
}

我发现,在添加行builder.AddEnvironmentVariables();之前,该函数运行良好。仅通过此更改,该函数在启动时突然退出,但例外情况是:

Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcFunctionInvocationDispatcherLoadBalancer.GetLanguageWorkerChannel的System.InvalidOperationException

其中隐藏着一条信息:“没有找到任何初始化的语言工作者”,据我所知,Azure函数语言是指“在启动过程中发生了一些不好的事情,但我不会告诉您什么或为什么”。

在我的特定用例中,我依赖于函数能够使用环境变量作为配置源,因为我的管道将这些变量作为站点配置传递到ARM模板。所以我的问题是,在孤立模式下,这怎么可能?

EN

回答 1

Stack Overflow用户

发布于 2022-05-18 16:11:01

实际上,环境变量是通过对ConfigureFunctionsWorkerDefaults的调用自动添加的。你可以在WorkerHostBuilderExtensions这里看到这个。我不知道为什么尝试在传统的dotnet核心方式中添加环境变量作为配置源,这会导致整个事件的崩溃,但至少我没有被阻止。希望这能帮到别人。

它还指出,这将影响您使用ConfigureAppConfigurationConfigureFunctionsWorkerDefaults扩展的顺序。由于后者添加了控制台输入和环境变量作为配置源,如果您还在磁盘上使用appsettings.json,则很可能希望环境变量覆盖其配置,因此需要在ConfigureAppConfiguration之后调用ConfigureFunctionsWorkerDefaults。因此,我的Program如下所示:

代码语言:javascript
复制
public class Program
{
    public static async Task Main()
    {
        var host = new HostBuilder()
            .ConfigureAppConfiguration((context, configurationBuilder) =>
            {
                configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

                if (context.HostingEnvironment.IsDevelopment())
                {
                    configurationBuilder.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true);
                }
                else
                {
                    configurationBuilder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
                }
            })
            .ConfigureFunctionsWorkerDefaults()
            .ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration))
            .Build();

        await host.RunAsync();
    }

    private static void ConfigureServices(IServiceCollection services, IConfiguration configuration)
    {
        services
            .AddLogging()
            .AddDomainLayer(configuration)
            .AddHttpLayer(configuration)
            .AddKeyVaultLayer(configuration);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72291001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档