我已将 .net6 Azure 函数(使用应用服务计划,而不是消耗)升级为独立的 .net8 函数。我所有的组件都有
<TargetFramework>net8.0</TargetFramework>
功能项目也有
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
还有
<ItemGroup>
<Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
</ItemGroup>
(我不知道它在做什么,但它在 Microsoft 升级文章中给出)。
部署时,管道设置以下值:
"FUNCTIONS_EXTENSION_VERSION": "~4",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED": 1,
"WEBSITE_RUN_FROM_PACKAGE": 1,
我的功能看起来很好,计划的功能被触发,并且服务总线消息通过。
尽管如此,Azure 仍显示警告:
The 'FUNCTIONS_WORKER_RUNTIME' is set to 'dotnet-isolated', which does not match the worker runtime metadata found in the deployed function app artifacts. The deployed artifacts are for 'dotnet'. See https://aka.ms/functions-invalid-worker-runtime for more information. The application will continue to run but may throw an exception in the future.
这两天我多次重新部署并重启该功能,但该消息并没有消失。
我开始寻找神秘的“工作运行时元数据”,但找不到任何有用的信息。然后我查看了管道构建的工件 zip 的内部,并在其中搜索了“dotnet”文本。唯一提到它的文本文件是worker.config.json,其中包含:
{
"description": {
"language": "dotnet-isolated",
"extensions": [ ".dll" ],
"defaultExecutablePath": "dotnet",
"defaultWorkerPath": "MyNamespace.Function.dll",
"workerIndexing": "true",
"canUsePlaceholder": true
}
}
和functions.metadata,其中所有函数都有
"language": "dotnet-isolated"
。因此,如果没有“隔离”,就不会提到“dotnet”。
Azure 中的功能设置在部署后看起来不错:运行时版本 ~4,.NET 版本是 .NET 8 隔离。
当我在 Azure 中查看各个函数本身并尝试编辑它们时,我收到此警告:
Editing .NET isolated Function Apps is not supported in the Azure portal. Use your local development environment to edit this Function App.
这表明使用“dotnet-isolated”语言的函数是正确的。
我在这里缺少什么? Azure 警告的这个神秘的“工作线程运行时元数据”在哪里?
我认为你根本没有错过任何东西。该警告表明,已部署的版本是进程内函数,与您正在部署的版本不同。这是迁移现有功能后所期望的。
您可以在门户中查看使用的语言。并将其更新为 dotnet-isolated。据我所知,这应该可以解决该警告。
如果您使用 ARM 模板,请确保将properties.siteConfig.netFrameworkVersion 设置为“v8.0”
如果您访问 https://resources.azure.com/,您应该能够看到应用服务的元数据,或者如果您在门户上应用设置后查看审核日志(从上面) 。但这些是通过第一次部署或更新语言来间接设置的