这是从前一个问题开始的。我正在尝试构建一个Azure函数,使用函数运行时的.NET 6和v4在一个孤立的进程中作为一个Linux容器映像运行。
我遵循了微软指南来获得一个工作的、正在运行的带有HTTP触发器的样例函数。然后,我开始了将我的代码添加到应用程序中的过程,并立即被阻止。这是我的Main Program方法
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模板。所以我的问题是,在孤立模式下,这怎么可能?
发布于 2022-05-18 16:11:01
实际上,环境变量是通过对ConfigureFunctionsWorkerDefaults的调用自动添加的。你可以在WorkerHostBuilderExtensions这里看到这个。我不知道为什么尝试在传统的dotnet核心方式中添加环境变量作为配置源,这会导致整个事件的崩溃,但至少我没有被阻止。希望这能帮到别人。
它还指出,这将影响您使用ConfigureAppConfiguration和ConfigureFunctionsWorkerDefaults扩展的顺序。由于后者添加了控制台输入和环境变量作为配置源,如果您还在磁盘上使用appsettings.json,则很可能希望环境变量覆盖其配置,因此需要在ConfigureAppConfiguration之后调用ConfigureFunctionsWorkerDefaults。因此,我的Program如下所示:
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);
}
}https://stackoverflow.com/questions/72291001
复制相似问题