JSON C# 中的格式问题

JSON Formatting issue in C#

我知道这可能是一件简单的事情或 C# 专家,但我有点难以使用 Azure Rest 从 Http 响应中获取值 API。

我想做什么:我需要获取 Azure TrafficManager ProfileNameEndpointNameTargetName 来自 Azure Rest API 使用 C#。我设法到达 ProfileName 但无法从响应中获取 Endpoint 名称和 Target 名称。

每个订阅都有多个流量管理器配置文件,每个配置文件都有多个端点。因此,我在 FOR 循环中循环了初始 ProfileName 响应(第一次休息 API 调用),它工作正常并试图在下面的代码中到达端点和目标(第二次休息 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 获取值的 C# 方法 API

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);
                    }
                }
            }
        }