函数应用程序在本地运行,但作为Linux容器部署。部署的函数没有报告门户中的任何问题,我可以看到函数刀片中列出的三个函数。但是,没有一个正在工作(一个是简单的HTTP,它返回502个不好的网关响应)。
因此,门户中没有明显的问题,但是对日志的检查会发现这个反复出现的异常:
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess的System.Threading.Tasks.TaskCanceledException
格式化的消息是:
未能为运行时启动新的语言工作人员:
我怀疑这与站点设置linuxFxVersion的价值有关。请注意,我试过使用DOTNET|6.0和DOTNET-ISOLATED|6.0。在这两种情况下,这似乎都没有什么区别,而且无论如何,当我导出函数应用程序的ARM模板时,它将linuxFxVersion设置为以DOCKER|为前缀的容器映像的URI。
这似乎与这是微软的具体建议。有关将主机版本固定在Linux上有关。但是,我仍然不清楚我应该如何评价我们,而且无论如何,来自另一个Microsoft文档的建议说:
要在Linux上支持zip部署和从部署包中运行,您还需要将linuxFxVersion站点配置设置更新为DotNet-Indivision6.0。
不管怎么说,这是我配置的细节。我听从了微软的指导,希望有人能发现我错过了什么.
项目文件的前两部分:
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<AzureFunctionsVersion>V4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>true</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.CosmosDB" Version="3.0.9" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.13" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.3.0" OutputItemType="Analyzer" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.5.2" />
</ItemGroup>host.json:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
}
}Main方法在Program.cs中:
public static async Task Main()
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.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);
}
configurationBuilder.AddEnvironmentVariables();
})
.ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration, context.HostingEnvironment))
.Build()
.RunAsync();
}函数配置管道设置以下应用程序设置:
FUNCTIONS_EXTENSION_VERSION: '~4'
FUNCTIONS_WORKER_RUNTIME: 'dotnet-isolated'如前所述,在供应期间定义的站点配置的最新版本包括:
linuxFxVersion: 'DOTNET-ISOLATED|6.0'Docker映像使用mcr.microsoft.com/azure-functions/dotnet-isolated:4作为发布应用程序的基本映像,并使用mcr.microsoft.com/dotnet/sdk:6.0构建它。
请告诉我有明显的东西我错过了。我们目前有两个功能应用程序,两者都不能部署为dotnet-孤立的。快把我逼疯了!
发布于 2022-05-18 14:15:47
在和这个搏斗了两天之后,我决定直接脱光衣服。从零开始跟踪微软指南。这使我发现以下几行是问题所在:
configurationBuilder.AddEnvironmentVariables();一旦我将这一行添加到我的Program中,并将一个新的图像推到函数应用程序中,一切都会在重启时中断。然而,没有迹象表明原因。Kudo公开的Docker日志将此报告为最后条目:
2022-05-18T14:06:46.295Zinfo-容器映像-站点函数名称-名称已成功初始化并已准备好为请求提供服务。
App跟踪显示,在Program.cs的第52行发生了异常,这是我的host.Run();行。
例外是:
Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcFunctionInvocationDispatcherLoadBalancer.GetLanguageWorkerChannel的System.InvalidOperationException
其中隐藏着一条信息:“没有找到任何初始化的语言工作者”,我理解是Azure函数语言,因为“在创业过程中发生了一些不好的事情,但我不会告诉你什么或为什么”。
因此,这至少解释了为什么我的函数没有运行,希望我的经验能在未来节省其他人的时间,但是由于我的应用程序依赖于通过管道添加到函数中的配置,所以我仍然没有一个可用的应用程序。为此,我将提出一个新的问题,并将其联系在这里.
更新
以下是后续问题,我已经回答了!
发布于 2022-05-18 15:38:31
您看到的异常不是直接来自您的应用程序,而是一个通用的异常,没有来自Azure函数运行时进程的detaills --所以它是无用的。
原因可以是什么,例如:忘记等待一项任务。
public static async Task Main()
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureAppConfiguration(builder =>
{
builder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
.Build();
})
.ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration, context.HostingEnvironment))
.Build();
host.RunAsync(); // await host.RunAsync();
}或者是损坏的appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft": "Warning",
"Host": "Warning",
"Function": "Information",
"Host.Aggregator": "Information"
}
}或者在启动过程中缺少配置调用。
public static async Task Main()
{
var host = new HostBuilder()
// .ConfigureFunctionsWorkerDefaults()
.ConfigureAppConfiguration(builder =>
{
builder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
.Build();
}))
.ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration, context.HostingEnvironment))
.Build();
await host.RunAsync();
}启动应用程序的Microsoft运行时进程捕获所有控制台日志,并在自己启动时发生异常时将其销毁。
顺便说一句,您还应该启用代码分析,这是默认情况下在.net 6中没有启用的。

https://stackoverflow.com/questions/72273025
复制相似问题