You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已部署的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执行以下命令触发函数(需替换参数):
    az rest --method get --uri "https://<functionapp-name>.azurewebsites.net/api/StartImport"
    
    若返回200响应,则触发器正常可用。

内容的提问来源于stack exchange,提问作者Reinder Wit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:32:49