c# - C#中的JSON格式问题
问题描述
我知道这可能是一件容易的事情或 C# 专家,但我有点努力使用 Azure Rest API 从 Http 响应中获取值。
我想做什么:我需要使用 C# 从 Azure Rest API获取 Azure TrafficManager ProfileName、EndpointName和TargetName 。我设法到达ProfileName但无法从响应中获取端点名称和目标名称。
每个订阅都有多个流量管理器配置文件,每个配置文件都有多个端点。因此,我在 FOR 循环中循环了初始 ProfileName 响应(第一次 Rest API 调用),它工作正常,并试图在下面的代码中到达端点和目标(第二次 Rest API 调用)。
请帮我从 2nd Rest API 调用中获取端点和目标。
我粘贴了从 2nd Rest API 调用中获得的 HTTP 响应。
具有端点名称和目标名称的第二个 Http 响应
{
"id":"\/subscriptions\/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\/resourceGroups\/MyResourceGroupName\/providers\/Microsoft.Network\/trafficManagerProfiles\/MyTrafficManagerProfileName",
"name":"MyTrafficManagerProfileName",
"type":"Microsoft.Network\/trafficManagerProfiles",
"location":"global",
"tags":{},
"properties":
{
"profileStatus":"Enabled",
"trafficRoutingMethod":"Weighted",
"dnsConfig":
{
"relativeName":"MyTrafficManagerProfileName",
"fqdn":"yTafficManagerProfileName.trafficmanager.net",
"ttl":60
},
"monitorConfig":
{
"profileMonitorStatus":"Online",
"protocol":"HTTPS",
"port":443,
"path":"\/vip",
"intervalInSeconds":30,
"toleratedNumberOfFailures":3,
"timeoutInSeconds":10
},
"endpoints":
[
{
"id":"\/subscriptions\/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\/resourceGroups\/MyResourceGroupName\/providers\/Microsoft.Network\/trafficManagerProfiles\/MyTrafficManagerProfileName\/azureEndpoints\/MyEndPointName1",
"name":"MyEndPointName1",
"type":"Microsoft.Network\/trafficManagerProfiles\/azureEndpoints",
"properties":
{
"endpointStatus":"Enabled",
"endpointMonitorStatus":"Online",
"targetResourceId":"\/subscriptions\/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\/resourceGroups\/MyResourceGroupName\/providers\/Microsoft.Web\/sites\/MyTrafficManagerProfileName",
"target":"MyTargetName1",
"weight":1000,
"priority":1,
"endpointLocation":"North Central US"
}
},
{
"id":"\/subscriptions\/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\/resourceGroups\/MyResourceGroupName\/providers\/Microsoft.Network\/trafficManagerProfiles\/MyTrafficManagerProfileName\/externalEndpoints\/MyEndPointName2",
"name":"MyEndPointName2",
"type":"Microsoft.Network\/trafficManagerProfiles\/externalEndpoints",
"properties":
{
"endpointStatus":"Disabled",
"endpointMonitorStatus":"Disabled",
"target":"MyTargetName2",
"weight":1,
"priority":2,
"endpointLocation":null
}
}
]
,"trafficViewEnrollmentStatus":"Disabled"
}
}
从 Azure Rest API 获取值的 C# 方法
private static async Task GetTMPDetailsAsync(string token, string TeamGroupsName, string ServiceName, string SubscriptionName, string SubscriptionGUID, string SQLServerName, string SQLServerAdmin, string SQLServerAdminPasword, string DatabaseName)
{
string ResourceType = "Microsoft.Network/trafficmanagerprofiles";
var httpClient = new HttpClient
{
BaseAddress = new Uri("https://management.azure.com/subscriptions/")
};
// Get Network Profile Name and ResourceGroupName
string URI = $"/subscriptions/{SubscriptionGUID}/resources?$filter=resourceType%20EQ%20'{ResourceType}'&api-version=2019-05-10";
httpClient.DefaultRequestHeaders.Remove("Authorization");
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
HttpResponseMessage response = await httpClient.GetAsync(URI).ConfigureAwait(false);
var HttpsResponse = await response.Content.ReadAsStringAsync();
dynamic ResourcesList = JsonConvert.DeserializeObject<object>(HttpsResponse);
if (ResourcesList.value != null && !ResourcesList.value.Contains("SubscriptionNotFound"))
{
foreach (dynamic ResourceName in ResourcesList["value"])
{
string ResourceID = ResourceName.id;
string ProfileName = ResourceName.name;
string Region = ResourceName.location;
string ResourceGroupName = ResourceID.Remove(0, 67);
int CharsToRemove = 52 + ProfileName.Length;
ResourceGroupName = ResourceGroupName.Remove(ResourceGroupName.Length - CharsToRemove);
var TMPhttpClient = new HttpClient
{
BaseAddress = new Uri("https://management.azure.com/subscriptions/")
};
// Get EndPoints and Targets
string TMPURI = $"/subscriptions/{SubscriptionGUID}/resourceGroups/{ResourceGroupName}/providers/{ResourceType}/{ProfileName}?api-version=2018-04-01";
httpClient.DefaultRequestHeaders.Remove("Authorization");
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
HttpResponseMessage EndPointResponse = await httpClient.GetAsync(TMPURI).ConfigureAwait(false);
var EndPointsResponse = await EndPointResponse.Content.ReadAsStringAsync();
dynamic ProfileList = JsonConvert.DeserializeObject<object>(EndPointsResponse);
foreach (dynamic ProfileDetailed in ProfileList)
{
string EndPointName = ProfileDetailed.properties.endpoints.name;
string Target = ProfileDetailed.properties.endpoints.properties.target;
DateTime RawDate = DateTime.Now;
string RefreshedAt = RawDate.ToString("yyyy-MM-dd HH:mm:ss.fff");
Console.WriteLine($"'{TeamGroupsName}', '{ServiceName}', '{SubscriptionName}', '{SubscriptionGUID}', '','', '{ProfileName}', '{Region}',' {EndPointName}', {Target}, '{RefreshedAt}'");
//string SQLStatement = ($"INSERT INTO AzureCapacityUsage..TMPDetailed_New" +
// $" Select '{TeamGroupsName}', '{ServiceName}', '{SubscriptionName}', '{SubscriptionGUID}', '','', '{ProfileName}', '{Region}',' {EndPointName}', {Target}, '{RefreshedAt}'");
//SQLConnectionHelper.ExecuteTSQL(SQLServerName, SQLServerAdmin, SQLServerAdminPasword, DatabaseName, SQLStatement);
}
}
}
}
解决方案
private static async Task GetTMPDetailsAsync(string token, string TeamGroupsName, string ServiceName, string SubscriptionName, string SubscriptionGUID, string SQLServerName, string SQLServerAdmin, string SQLServerAdminPasword, string DatabaseName)
{
string ResourceType = "Microsoft.Network/trafficmanagerprofiles";
var httpClient = new HttpClient
{
BaseAddress = new Uri("https://management.azure.com/subscriptions/")
};
// Get Network Profile Name and ResourceGroupName
string URI = $"/subscriptions/{SubscriptionGUID}/resources?$filter=resourceType%20EQ%20'{ResourceType}'&api-version=2019-05-10";
httpClient.DefaultRequestHeaders.Remove("Authorization");
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
HttpResponseMessage response = await httpClient.GetAsync(URI).ConfigureAwait(false);
var HttpsResponse = await response.Content.ReadAsStringAsync();
dynamic ResourcesList = JsonConvert.DeserializeObject<object>(HttpsResponse);
if (ResourcesList.value != null && !ResourcesList.value.Contains("SubscriptionNotFound"))
{
foreach (dynamic ResourceName in ResourcesList["value"])
{
string ResourceID = ResourceName.id;
string ProfileName = ResourceName.name;
string Region = ResourceName.location;
string ResourceGroupName = ResourceID.Remove(0, 67);
int CharsToRemove = 52 + ProfileName.Length;
ResourceGroupName = ResourceGroupName.Remove(ResourceGroupName.Length - CharsToRemove);
var TMPhttpClient = new HttpClient
{
BaseAddress = new Uri("https://management.azure.com/subscriptions/")
};
// Get EndPoints and Targets
string TMPURI = $"/subscriptions/{SubscriptionGUID}/resourceGroups/{ResourceGroupName}/providers/{ResourceType}/{ProfileName}?api-version=2018-04-01";
httpClient.DefaultRequestHeaders.Remove("Authorization");
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
HttpResponseMessage EndPointResponse = await httpClient.GetAsync(TMPURI).ConfigureAwait(false);
var endPointsResponse = await EndPointResponse.Content.ReadAsStringAsync();
ProfileDetailed profiles = JsonConvert.DeserializeObject<ProfileDetailed>(endPointsResponse);
foreach (var endpoint in profiles.Properties.Endpoints)
{
Console.WriteLine($"{endpoint}");
string endpointName = endpoint.Name;
string target = endpoint.EndPointProperties.Target;
DateTime RawDate = DateTime.Now;
string RefreshedAt = RawDate.ToString("yyyy-MM-dd HH:mm:ss.fff");
Console.WriteLine($"'{TeamGroupsName}', '{ServiceName}', '{SubscriptionName}', '{SubscriptionGUID}', '','', '{ProfileName}', '{endpointName}', {target}, '{RefreshedAt}'");
string SQLStatement = ($"INSERT INTO AzureCapacityUsage..TMPDetailed_New" +
$" Select '{TeamGroupsName}', '{ServiceName}', '{SubscriptionName}', '{SubscriptionGUID}', '','', '{ProfileName}', '{endpointName}', '{target}', '{RefreshedAt}'");
SQLConnectionHelper.ExecuteTSQL(SQLServerName, SQLServerAdmin, SQLServerAdminPasword, DatabaseName, SQLStatement);
}
}
}
}
推荐阅读
- apache-spark - 带有 spark 2.4 的 cloudera 6.1 中的 commons-lang3 无效版本
- r - R错误:错误:`f`必须是一个因子(或字符向量)
- php - 如何在 PHP 中使用 json_decode?
- r - Cox 模型,coxph(),无事件对照处理,种子萌发
- ansible - 剧本执行后如何将调试输出逐行重定向到文本文件中
- javascript - 如何将 CodeSandbox proyecto 转换为 React 生产应用程序?
- python - Sequential'对象在保存keras模型时没有属性'output_names'
- java - 在 com.example.u.locationtracker.MainActivity.onCreate(MainActivity.java:39)
- jquery - 将选择器样式作为脉冲动画应用于元素
- php - 如何从 Azuracast API json 输出中获取 PHP 数据?