如何通过C#(.NET 6)代码复刻Visual Studio的Azure函数发布流程?
用C#控制台应用复刻Visual Studio发布Azure Function的完整流程
前提准备
- 安装
Azure.Identity、Azure.ResourceManager.Functions、Microsoft.Web.DeploymentNuGet包 - 本地保留Visual Studio手动发布生成的Azure Function发布包(zip格式)
- 拥有目标Azure订阅的Contributor权限
步骤1:初始化Azure资源管理客户端
使用DefaultAzureCredential完成认证,兼容本地开发环境的多种认证方式(如Azure CLI、Visual Studio登录态),无需硬编码密钥。
using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Functions; using Azure.ResourceManager.Resources; var credential = new DefaultAzureCredential(); var armClient = new ArmClient(credential); var subscriptionId = "你的Azure订阅ID"; var subscription = armClient.GetSubscriptionResource(new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
步骤2:创建Azure Function App依赖资源
创建资源组(若无现成资源组)
var resourceGroupName = "自定义资源组名称"; var location = Azure.Core.AzureLocation.EastUs; // 根据需求选择区域 var resourceGroupData = new ResourceGroupData(location); var resourceGroup = await subscription.GetResourceGroups().CreateOrUpdateAsync( WaitUntil.Completed, resourceGroupName, resourceGroupData);
创建存储账户
Function App必须依赖存储账户存储配置、日志等数据,需使用StorageV2类型:
var storageAccountName = "全局唯一的存储账户名"; // 仅支持小写字母+数字 var storageAccountData = new StorageAccountCreateData(location, StorageSkuName.StandardLrs, StorageKind.StorageV2) { EnableHttpsTrafficOnly = true }; var storageAccounts = resourceGroup.Value.GetStorageAccounts(); await storageAccounts.CreateOrUpdateAsync(WaitUntil.Completed, storageAccountName, storageAccountData);
创建App服务计划(以消耗型计划为例)
若没有现成的App服务计划,可创建适合Serverless场景的消耗型计划:
var planName = "自定义服务计划名称"; var planData = new AppServicePlanData(location) { Sku = new AppServiceSkuDescription { Name = "Y1", Tier = "Dynamic", Size = "Y1" } }; var appServicePlans = resourceGroup.Value.GetAppServicePlans(); var appServicePlan = await appServicePlans.CreateOrUpdateAsync(WaitUntil.Completed, planName, planData);
创建Function App实例
配置运行时、操作系统等参数,与本地发布包的环境保持一致:
var functionAppName = "全局唯一的Function App名称"; var storageAccount = await storageAccounts.GetAsync(storageAccountName); var storageAccountKey = storageAccount.Value.GetKeys().Value.First().Value; var functionAppData = new FunctionAppData(location) { ServerFarmId = appServicePlan.Value.Id, StorageAccountName = storageAccountName, StorageAccountKey = storageAccountKey, RuntimeStack = new FunctionAppRuntimeStack(FunctionAppRuntimeStackName.DotnetIsolated, "7.0"), // 匹配本地Function运行时版本 OsType = FunctionAppOsType.Windows, // 或Linux,需与发布包环境一致 HttpsOnly = true }; var functionApps = resourceGroup.Value.GetFunctionApps(); var functionApp = await functionApps.CreateOrUpdateAsync(WaitUntil.Completed, functionAppName, functionAppData);
步骤3:部署Function代码到Azure
使用Web Deploy(MSDeploy)机制上传本地发布包,与Visual Studio发布逻辑完全一致:
using Microsoft.Web.Deployment; var packagePath = @"本地发布包路径,如bin\Release\net7.0\publish.zip"; var publishUrl = $"https://{functionAppName}.scm.azurewebsites.net:443/msdeploy.axd?site={functionAppName}"; var username = "$" + functionAppName; var publishingCreds = await functionApp.Value.GetPublishingCredentialsAsync(); var password = publishingCreds.Value.Password; var deploymentOptions = new DeploymentBaseOptions { ComputerName = publishUrl, UserName = username, Password = password, AuthenticationType = "Basic" }; var deploymentObject = DeploymentManager.CreateObject(DeploymentWellKnownProvider.Package, packagePath); await deploymentObject.SyncToAsync(DeploymentWellKnownProvider.AppHostConfig, functionAppName, deploymentOptions);
关键注意事项
- 本地发布包的运行时版本、操作系统类型必须与Function App配置完全匹配,否则部署后会出现运行错误
DefaultAzureCredential可无缝适配本地开发与生产环境,生产环境可使用托管标识替代本地认证方式- 可将订阅ID、资源名称等参数抽离为配置项,避免硬编码
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

