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

如何用C#编写Azure Function获取订阅内的WebApp列表?

用C# Azure Function获取当前订阅内的WebApp列表

完全可以通过C#实现这个需求,直接调用Azure资源管理API获取订阅内的所有WebApp,这比依赖数据库命名规则推导的方案更准确、稳定。

实现步骤

1. 安装依赖包

在Azure Function项目中安装最新的Azure资源管理器SDK相关包:

Install-Package Azure.ResourceManager.AppService
Install-Package Azure.Identity

Azure.Identity用于处理托管身份认证,无需硬编码凭据;Azure.ResourceManager.AppService是专门用于操作App Service资源的SDK。

2. 配置托管身份与权限

  • 给你的Azure Function启用系统分配托管身份(在Function App的「身份」设置页开启)。
  • 前往目标Azure订阅的「访问控制(IAM)」页面,给这个托管身份分配网站读取者(Website Reader)角色,确保它拥有读取订阅内WebApp资源的权限。

3. 编写Function代码示例

以下是HTTP触发的Function示例,核心逻辑是获取当前订阅下的所有WebApp:

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.AppService;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;

public class GetWebAppsFunction
{
    private readonly ILogger<GetWebAppsFunction> _logger;
    private readonly ArmClient _armClient;

    public GetWebAppsFunction(ILogger<GetWebAppsFunction> logger)
    {
        _logger = logger;
        // 使用默认Azure凭据,自动适配托管身份/本地开发凭据(Azure CLI、VS等)
        _armClient = new ArmClient(new DefaultAzureCredential());
    }

    [Function("GetWebApps")]
    public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestData req)
    {
        _logger.LogInformation("开始获取订阅内的WebApp列表");

        try
        {
            // 获取订阅ID:优先从环境变量读取,无则自动枚举当前身份有权限的订阅
            var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
            if (string.IsNullOrEmpty(subscriptionId))
            {
                var subscriptions = await _armClient.GetSubscriptions().GetAllAsync().ToEnumerableAsync();
                subscriptionId = subscriptions.First().Id.ToString().Split('/').Last();
            }

            var subscription = await _armClient.GetSubscriptionAsync(subscriptionId);
            var webAppCollection = subscription.GetWebSites();

            var webAppList = new List<object>();
            await foreach (var webApp in webAppCollection.GetAllAsync())
            {
                webAppList.Add(new
                {
                    Name = webApp.Data.Name,
                    ResourceGroup = webApp.Data.ResourceGroupName,
                    DefaultHostName = webApp.Data.DefaultHostName
                });
                _logger.LogInformation("找到WebApp: {Name}", webApp.Data.Name);
            }

            var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
            await response.WriteAsJsonAsync(new { WebApps = webAppList });
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "获取WebApp列表失败");
            var response = req.CreateResponse(System.Net.HttpStatusCode.InternalServerError);
            await response.WriteStringAsync("获取WebApp列表时发生错误");
            return response;
        }
    }
}

关键说明

  • 身份认证:DefaultAzureCredential会自动适配运行环境,生产环境用Function的托管身份,本地开发时自动使用Azure CLI、Visual Studio等已登录的凭据,无需额外配置。
  • 订阅ID获取:可以通过环境变量AZURE_SUBSCRIPTION_ID明确指定,也可以自动枚举当前身份有权限的订阅(适合多订阅场景)。
  • 资源筛选:如果需要筛选特定资源组或WebApp类型,可在GetAllAsync()中传入筛选参数,例如webAppCollection.GetAllAsync(filter: "resourceGroup eq 'your-resource-group'")。

方案优势

相比查询数据库推导WebApp名称的方式,这个方案:

  • 数据直接来自Azure官方管理API,完全准确,不受数据库命名规则变更影响。
  • 无需维护数据库连接逻辑,减少依赖点与潜在故障。
  • 权限控制更精细,可通过IAM角色精确限定Function能访问的资源范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:25:22