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

如何通过C#(.NET 6)代码复刻Visual Studio的Azure函数发布流程?

用C#控制台应用复刻Visual Studio发布Azure Function的完整流程

前提准备

  • 安装Azure.Identity、Azure.ResourceManager.Functions、Microsoft.Web.Deployment NuGet包
  • 本地保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:21:17