如何用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
相关产品推荐
相关产品推荐

