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

通过ARM模板部署Azure Function后出现404错误,VS部署正常

Azure Function部署后404问题的解决方案

问题核心原因

你遇到的404错误,本质是导出的ARM模板存在多处关键配置缺失或硬编码错误,导致Function App无法正确识别和加载函数代码。

具体问题及修复方案

1. 存储账户依赖配置错误

Azure Function必须关联存储账户才能运行(用于存储函数元数据、日志、触发器状态等),但你的模板中Microsoft.Web/sites资源的storageAccountRequired被设为false,这是致命错误。

修复步骤:

  • 将storageAccountRequired改为true
  • 在siteConfig的appSettings中添加AzureWebJobsStorage配置项,指向你的存储账户连接字符串
  • 若模板未包含存储账户资源,需补充添加存储账户定义(或引用已存在的存储账户)

2. 函数资源的硬编码URL不匹配

模板中Microsoft.Web/sites/functions下的script_root_path_href、script_href等字段都是硬编码的myFuncName域名,若部署时通过参数动态传入函数名,会导致路径完全错误,无法找到函数代码。

修复步骤:
将所有硬编码的域名替换为参数引用,例如:

"script_root_path_href": "[concat('https://', parameters('sites_myFuncName_name'), '.scm.azurewebsites.net/api/vfs/site/wwwroot/FuncName/')]"

同理修改script_href、config_href、invoke_url_template等所有包含固定域名的字段。

3. 缺少Function运行时关键配置

手动部署时会自动添加的Function运行时配置,在导出的模板中被遗漏,导致函数运行环境无法初始化。

修复步骤:
在siteConfig的appSettings中添加以下必填项:

"appSettings": [
    {
        "name": "FUNCTIONS_EXTENSION_VERSION",
        "value": "~4"
    },
    {
        "name": "FUNCTIONS_WORKER_RUNTIME",
        "value": "dotnet"
    },
    {
        "name": "AzureWebJobsStorage",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', parameters('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[0].value)]"
    }
]

4. 客户端证书要求过严

模板中clientCertMode设为Required,若访问时未提供客户端证书,会直接被拒绝访问(表现为404或403)。

修复步骤:
先将clientCertMode改为Optional测试,确认问题是否由证书要求导致,后续再根据实际需求调整。

修复后关键部分的ARM模板示例

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "sites_myFuncName_name": {
            "defaultValue": "myFuncName",
            "type": "String"
        },
        "serverfarms_FuncsPlan_externalid": {
            "defaultValue": "/subscriptions/2sdr7sec-8sd7-78sd-a628-78asfd89sfed/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/hostingPlanName",
            "type": "String"
        },
        "storageAccountName": {
            "type": "String",
            "defaultValue": "myfuncstorage"
        }
    },
    "resources": [
        {
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2021-04-01",
            "name": "[parameters('storageAccountName')]",
            "location": "North Europe",
            "sku": {"name": "Standard_LRS"},
            "kind": "StorageV2"
        },
        {
            "type": "Microsoft.Web/sites",
            "apiVersion": "2022-03-01",
            "name": "[parameters('sites_myFuncName_name')]",
            "location": "North Europe",
            "kind": "functionapp",
            "properties": {
                "enabled": true,
                "serverFarmId": "[parameters('serverfarms_FuncsPlan_externalid')]",
                "storageAccountRequired": true,
                "siteConfig": {
                    "numberOfWorkers": 1,
                    "alwaysOn": false,
                    "appSettings": [
                        {"name": "FUNCTIONS_EXTENSION_VERSION", "value": "~4"},
                        {"name": "FUNCTIONS_WORKER_RUNTIME", "value": "dotnet"},
                        {"name": "AzureWebJobsStorage", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', parameters('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[0].value)]"}
                    ]
                },
                "clientCertMode": "Optional"
            },
            "dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"]
        },
        {
            "type": "Microsoft.Web/sites/functions",
            "apiVersion": "2022-03-01",
            "name": "[concat(parameters('sites_myFuncName_name'), '/FuncName')]",
            "location": "North Europe",
            "dependsOn": ["[resourceId('Microsoft.Web/sites', parameters('sites_myFuncName_name'))]"],
            "properties": {
                "script_root_path_href": "[concat('https://', parameters('sites_myFuncName_name'), '.scm.azurewebsites.net/api/vfs/site/wwwroot/FuncName/')]",
                "script_href": "[concat('https://', parameters('sites_myFuncName_name'), '.scm.azurewebsites.net/api/vfs/site/wwwroot/bin/MyFuncName.dll')]",
                "config_href": "[concat('https://', parameters('sites_myFuncName_name'), '.scm.azurewebsites.net/api/vfs/site/wwwroot/FuncName/function.json')]",
                "invoke_url_template": "[concat('https://', parameters('sites_myFuncName_name'), '.azurewebsites.net/api/FuncName')]",
                "language": "DotNetAssembly",
                "isDisabled": false
            }
        }
    ]
}

额外排查步骤

  • 部署后进入Azure门户的Function App,查看配置>应用设置,确认上述必填配置项是否存在且正确
  • 查看监控>日志,检查是否有函数加载失败的具体错误信息
  • 确认代码部署后,site/wwwroot目录下是否存在函数的function.json和对应DLL文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:24:26