使用Azure C# SDK获取网站配置设置失败的技术求助
问题
我尝试从Azure网站获取设置和连接字符串,用于内部控制台工具,但过程比预期困难。目前使用以下C#代码:
var armClient = new ArmClient(new DefaultAzureCredential(), "[My subscription ID]"); var webApp = armClient.GetWebSiteResource(new Azure.Core.ResourceIdentifier("[my resource identifier]")); var b = webApp.GetAllConfigurationData(); var c = b.First(); Console.WriteLine(c.Name); Console.WriteLine(c.ConnectionStrings == null ? "null" : c.ConnectionStrings.Count); Console.WriteLine(c.AppSettings == null ? "null" : c.AppSettings.Count);
执行后能正确输出网站名称,但ConnectionStrings和AppSettings均返回null,而Azure门户中确实存在这些配置。GetAllConfigurationData的文档提示可能需要多次调用和迭代,但我不清楚具体操作方式。我需要实现与PowerShell命令az webapp config appsettings list --name foo --resource-group bar等效的功能,且必须使用控制台应用,请问该如何解决?
解决方案
问题出在GetAllConfigurationData()返回的是异步分页结果,直接调用First()只会拿到未完全加载的初始对象,无法获取完整的配置数据。以下是两种可行的解决方法:
方法1:使用专用方法直接获取(推荐)
Azure.ResourceManager.Sites库提供了更直接的API来单独获取应用设置和连接字符串,无需处理分页逻辑:
using Azure; using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Sites; var armClient = new ArmClient(new DefaultAzureCredential(), "[你的订阅ID]"); var webApp = armClient.GetWebSiteResource(new ResourceIdentifier("[你的资源ID]")); // 获取应用设置 var appSettingsResult = await webApp.GetSiteAppSettingsAsync(); var appSettings = appSettingsResult.Value.Properties; foreach (var setting in appSettings) { Console.WriteLine($"应用设置: {setting.Key} = {setting.Value}"); } // 获取连接字符串 var connectionStringsResult = await webApp.GetSiteConnectionStringsAsync(); var connectionStrings = connectionStringsResult.Value.Properties; foreach (var connStr in connectionStrings) { Console.WriteLine($"连接字符串: {connStr.Key} - 类型: {connStr.Value.Type}"); Console.WriteLine($"值: {connStr.Value.Value}"); }
方法2:正确遍历分页结果
如果一定要使用GetAllConfigurationData(),需要异步遍历所有分页项以确保加载完整数据:
using Azure; using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Sites; var armClient = new ArmClient(new DefaultAzureCredential(), "[你的订阅ID]"); var webApp = armClient.GetWebSiteResource(new ResourceIdentifier("[你的资源ID]")); await foreach (var configData in webApp.GetAllConfigurationDataAsync()) { if (configData.AppSettings != null) { foreach (var setting in configData.AppSettings) { Console.WriteLine($"应用设置: {setting.Key} = {setting.Value}"); } } if (configData.ConnectionStrings != null) { foreach (var connStr in configData.ConnectionStrings) { Console.WriteLine($"连接字符串: {connStr.Key} - 类型: {connStr.Value.Type}"); Console.WriteLine($"值: {connStr.Value.Value}"); } } }
注意事项
- 确保项目引用了最新版的
Azure.ResourceManager.SitesNuGet包 - 运行代码的身份(本地开发时为你的Azure账号)需要拥有网站配置读取权限,比如
Website Contributor或Reader角色
内容的提问来源于stack exchange,提问作者Ari Roth
相关产品推荐
相关产品推荐

