已部署的Isolated模式Azure Function App返回404问题排查
问题描述
通过Azure DevOps结合YAML与Bicep部署了Isolated V7版本的Azure Function App,但无法访问其中的HTTPTrigger,请求返回404错误。本地运行时,通过Postman访问http://localhost:7222/api/StartImport可正常得到200 OK响应。
相关代码与配置
C# HttpTrigger代码
[Function(nameof(StartImport))] public async Task<HttpResponseData> StartImport( [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req, [DurableClient] DurableTaskClient client, FunctionContext executionContext) { // call orchestrator... }
构建YAML配置
- task: UseDotNet@2 inputs: packageType: "sdk" version: "7.x" - task: DotNetCoreCLI@2 inputs: command: "restore" projects: "**/[PROJECT].csproj" - task: DotNetCoreCLI@2 inputs: projects: "**/[PROJECT].csproj" arguments: "--configuration $(BuildConfiguration)" - task: DotNetCoreCLI@2 inputs: command: publish publishWebProjects: false projects: "**/[PROJECT].csproj" arguments: "--configuration $(BuildConfiguration) --output publish_output" modifyOutputPath: false - task: ArchiveFiles@2 inputs: rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output" includeRootFolder: false archiveFile: "$(System.ArtifactsDirectory)/build$(Build.BuildId).zip" - task: PublishBuildArtifacts@1 displayName: "Publish build artifacts"
Bicep基础设施配置片段
resource plan 'Microsoft.Web/serverfarms@2022-09-01' = { name: 'pl-${functionAppName}' location: resourceLocation sku: { tier: 'ElasticPremium' name: 'EP1' } kind: 'elastic' properties: { targetWorkerCount: 0 maximumElasticWorkerCount: 20 elasticScaleEnabled: true isSpot: false } } resource functionappsite 'Microsoft.Web/sites@2022-09-01' = { name: '${functionAppName}' location: resourceLocation kind: 'functionapp' identity: { type: 'SystemAssigned' } properties: { httpsOnly: true siteConfig: { appSettings: [ { name: 'FUNCTIONS_EXTENSION_VERSION' value: '~4' } { name: 'FUNCTIONS_WORKER_RUNTIME' value: 'dotnet-isolated' } { name: 'WEBSITE_RUN_FROM_PACKAGE' value: '1' } { name: 'AzureWebJobsStorage' value: '[CONNECTION]' } { name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING' value: '[CONNECTION]' } { name: 'WEBSITE_CONTENTSHARE' value: '[SHARE NAME]' } { name: 'AzureBlobConnectionString' value: '[CONNECTION]' } ] use32BitWorkerProcess: true } serverFarmId: plan.id clientAffinityEnabled: false } }
部署ZIP包的YAML配置
- task: AzureFunctionApp@1 inputs: azureSubscription: [SUBSCRIPTION] appName: ${{ parameters.functionAppName }} package: $(Agent.BuildDirectory)/drop/build$(Build.BuildId).zip
已确认ZIP包已部署到Function App的C:\home\data\SitePackages目录,存储账户创建成功,Function App的“Functions” blade无函数显示(已知为Isolated模式正常现象),应用主页显示运行正常,但访问https://[FUNCTIONAPPNAME].azurewebsites.net/api/StartImport或https://[FUNCTIONAPPNAME].azurewebsites.net/StartImport均返回404。
排查与解决步骤
1. 确认路由访问的正确性
Isolated模式下,HTTP触发器默认路由格式为https://<functionapp-name>.azurewebsites.net/api/<function-name>,你访问的/api/StartImport格式是正确的,但需注意:
- 检查代码中是否给
HttpTrigger添加了自定义Route属性,若有则需使用对应路由。 - 确认Function App已完成冷启动(Premium计划首次部署或空闲后启动可能需要1-2分钟),可等待几分钟后再次尝试访问。
2. 验证部署包内容完整性
- 登录Kudu站点(
https://<functionapp-name>.scm.azurewebsites.net),进入Debug Console > PowerShell,查看C:\home\site\wwwroot目录下的文件是否与本地publish_output目录一致,需确保包含host.json、函数项目的dll文件、以及所有依赖项。 - 检查ArchiveFiles任务是否正确打包:由于设置了
includeRootFolder: false,ZIP包解压后应直接包含所有文件,而非嵌套在publish_output文件夹中。可在Kudu的Site Tools > Zip Push Deploy页面上传测试包验证。
3. 检查Function App运行时配置
- 确认Bicep中配置的应用设置正确:
FUNCTIONS_WORKER_RUNTIME设为dotnet-isolated(符合Isolated V7要求)。FUNCTIONS_EXTENSION_VERSION设为~4(与Isolated V7兼容)。WEBSITE_RUN_FROM_PACKAGE设为1(启用从包运行模式,确保部署包被正确加载)。
- 检查
AzureWebJobsStorage连接字符串是否有效,Isolated模式下该配置是函数宿主启动的必要条件。
4. 查看函数加载日志
Isolated模式下无法通过门户查看函数列表,需通过日志排查函数是否成功注册:
- 在Azure门户中进入Function App,选择Monitoring > Logs,使用查询语句查看宿主启动日志:
若能看到AppServiceConsoleLogs | where Message contains "Registered function"Registered function 'StartImport'相关日志,说明函数已成功加载;若没有,需检查是否有依赖缺失、代码错误等导致加载失败。 - 查看Kudu日志目录
D:\home\LogFiles\Application\Functions\Host下的最新日志文件,查找启动错误或函数注册失败的详细信息。
5. 验证构建过程正确性
- 检查DotNetCoreCLI的publish命令是否生成了完整的输出:本地执行
dotnet publish --configuration Release --output publish_output,确认publish_output目录包含所有必要文件。 - 确认构建任务中指定的
[PROJECT].csproj路径正确,避免打包错误的项目。
验证部署成功与触发器可用性的方法
- 验证部署完整性:通过Kudu查看
C:\home\site\wwwroot的文件结构与本地发布目录一致,且ZIP包状态在Function App > Deployment Center > Deployment History中显示成功。 - 验证宿主启动:在日志中查找
Worker process started and initialized或Host started相关信息,确认函数宿主正常运行。 - 测试触发器:除了直接访问接口,还可通过Azure CLI执行以下命令触发函数(需替换参数):
若返回200响应,则触发器正常可用。az rest --method get --uri "https://<functionapp-name>.azurewebsites.net/api/StartImport"
内容的提问来源于stack exchange,提问作者Reinder Wit
相关产品推荐
相关产品推荐

