ARM模板部署C# Azure Function后未显示的配置问题咨询
首先要明确:预编译C#函数(编译为.dll的那种,不是.csx脚本)的代码部署和ARM模板是完全分离的——ARM模板只负责创建Function App的基础设施(比如应用服务计划、存储账户、Function App实例本身),而函数代码需要通过单独的部署流程(比如Octopus的App Service部署步骤)来推送,ARM模板里不需要额外配置函数代码的内容(这也是为什么不推荐用ARM部署csx脚本的原因,预编译函数走常规的代码部署流程更规范)。
接下来我们从ARM模板配置、Octopus部署步骤两个方向排查:
一、检查ARM模板的关键配置
看你提供的模板片段,有几个点需要确认:
1. 运行时版本与扩展版本
- 你的
FUNCTIONS_EXTENSION_VERSION设置为~2,这个版本非常老旧(对应.NET Core 2.x),如果你的C#函数是基于.NET 6/7/8开发的,这个版本完全不兼容,会导致函数无法加载。建议升级到~4(适配.NET 6+ in-process/isolated)或者~3(适配.NET Core 3.1)。 - 确认
FUNCTIONS_WORKER_RUNTIME的runtimeStack参数值正确:- 如果你用的是in-process模型的函数,值应为
dotnet - 如果你用的是isolated进程模型,值应为
dotnet-isolated
- 如果你用的是in-process模型的函数,值应为
2. 存储相关配置
你配置了WEBSITE_CONTENTAZUREFILECONNECTIONSTRING和WEBSITE_CONTENTSHARE,这两个设置主要针对消耗计划(Consumption Plan)的Function App,用来挂载Azure Files存储函数代码。如果你的Function App使用的是App Service Plan(比如Basic/Standard等),这两个配置不是必须的,甚至可能导致代码部署路径异常。可以尝试移除这两个设置,重新部署ARM模板后再推送函数代码。
修正后的模板片段示例(调整版本和存储配置):
{ "type": "Microsoft.Web/sites", "apiVersion": "2022-09-01", // 建议使用较新的API版本 "name": "[parameters('sites_..._name')]", "location": "[parameters('location')]", "kind": "functionapp", "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('serverfarms_..._name'))]", "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ], "identity": { "type": "SystemAssigned" }, "properties": { "enabled": true, "siteConfig": { "appSettings": [ { "name": "FUNCTIONS_WORKER_RUNTIME", "value": "dotnet" // 明确设置为dotnet,替换原来的runtimeStack参数(确保参数值正确) }, { "name": "AzureWebJobsStorage", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2021-09-01').keys[0].value)]" }, { "name": "FUNCTIONS_EXTENSION_VERSION", "value": "~4" // 升级到最新稳定扩展版本 }, // 移除WEBSITE_CONTENTAZUREFILECONNECTIONSTRING和WEBSITE_CONTENTSHARE(如果用App Service Plan) // ...其他配置 ] }, // ...其他属性 "httpsOnly": true, "redundancyMode": "None" } }
二、排查Octopus Deploy的部署步骤
你提到“通过单独步骤(使用模板)完成部署”——这里可能存在误区:ARM模板步骤只能部署基础设施,不能部署函数代码。你需要用Octopus的专门部署步骤:
- 确保你使用的是Deploy Azure App Service步骤,而不是ARM模板部署步骤。
- 该步骤的部署包应该是你C#函数项目编译后的发布包:
- 可以通过
dotnet publish命令生成,路径一般是bin/Release/net6.0/publish(根据你的.NET版本调整) - 发布包应该包含
host.json、local.settings.json(可选)、bin目录,以及每个函数对应的文件夹(比如HttpTrigger1)
- 可以通过
- 检查Octopus的部署日志,看是否有报错:比如“部署成功但函数未加载”可能是因为运行时不兼容,或者代码包结构错误。
三、手动验证排除问题
为了排除Octopus的问题,你可以手动将发布包上传到Azure Portal的Function App:
- 进入Function App的“部署中心”,选择“高级工具”(Kudu)
- 进入“Debug console” → “CMD”,导航到
site/wwwroot目录 - 上传你的发布包内容,然后重启Function App
- 回到Function App页面,看是否能看到函数。如果手动上传能显示,说明问题出在Octopus的部署步骤配置上;如果还是不显示,说明代码或Function App的运行时配置有问题。
内容的提问来源于stack exchange,提问作者Per

