.NET 8独立模式Azure Function采用Run From Package部署后无法触发
问题描述
- 环境:Windows环境Azure Function,基于.NET 8,独立模式(Isolated),CRON定时器触发
- 初始部署:发布到本地文件夹,配置为Release、目标框架net8.0、目标运行时win-x64、自包含模式,部署到wwwroot文件夹后运行正常
- 操作:添加应用设置
WEBSITE_RUN_FROM_PACKAGE,值设为"1",确认wwwroot文件夹变为只读;将相同文件部署到SitePackages文件夹后重启App Service - 问题:重启成功后,定时器函数不再触发(未配置URL,压缩包大小远小于1GB限制)
补充信息(2023年12月18日更新)
项目模式与csproj内容
项目采用独立模式(Isolated),csproj文件内容如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> <OutputType>Exe</OutputType> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <TreatWarningsAsErrors>True</TreatWarningsAsErrors> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> <TreatWarningsAsErrors>True</TreatWarningsAsErrors> </PropertyGroup> <ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.3.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.3" OutputItemType="Analyzer" /> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.0" /> <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="8.0.0" /> </ItemGroup> <ItemGroup> <None Update="host.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="local.settings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </None> </ItemGroup> <ItemGroup> <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" /> </ItemGroup> </Project>
配置截图说明
- 发布配置文件截图
- 应用设置截图
- 函数运行时设置截图
- 常规设置截图
异常信息
启用Run From Package模式后,出现以下错误:
完整异常:
System.NullReferenceException : 对象引用未设置到对象的实例。
在 Microsoft.Azure.WebJobs.Script.FunctionMetadataManager.GetFallbackWorkerConfig() 位置 //src/WebJobs.Script/Host/FunctionMetadataManager.cs:129
在 Microsoft.Azure.WebJobs.Script.FunctionMetadataManager.LoadFunctionMetadata(Boolean forceRefresh,Boolean includeCustomProviders,IFunctionInvocationDispatcher dispatcher,IList1 workerConfigs) 位置 /_/src/WebJobs.Script/Host/FunctionMetadataManager.cs:137 在 Microsoft.Azure.WebJobs.Script.FunctionMetadataManager.GetFunctionMetadata(Boolean forceRefresh,Boolean applyAllowList,Boolean includeCustomProviders,IList1 workerConfigs) 位置 //src/WebJobs.Script/Host/FunctionMetadataManager.cs:90
在异步方法 Microsoft.Azure.WebJobs.Script.WebHost.Management.FunctionsSyncManager.GetSyncTriggersPayload() 位置 //src/WebJobs.Script.WebHost/Management/FunctionsSyncManager.cs:312
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在异步方法 Microsoft.Azure.WebJobs.Script.WebHost.Management.FunctionsSyncManager.TrySyncTriggersAsync(Boolean isBackgroundSync) 位置 //src/WebJobs.Script/WebHost/Management/FunctionsSyncManager.cs:125
内容的提问来源于stack exchange,提问作者DrGriff

