JSON Проблема с форматированием в C# - PullRequest
0 голосов
/ 19 июня 2020

Я понимаю, что это может быть легко, или C# экспертов, но я как бы изо всех сил пытаюсь получить значения из Http-ответа, используя Azure Rest API.

То, что я пытаюсь do : у меня есть требование получить Azure TrafficManager ProfileName , EndpointName и TargetName из Azure Rest API с использованием C#. Мне удалось добраться до ProfileName , но не удалось получить Endpoint Name и Target Name из ответа.

Каждая подписка имеет более одного профиля менеджера Traffi c, и каждый профиль имеет несколько конечных точек. Итак, я зациклил начальный ответ ProfileName (1-й вызов API-интерфейса отдыха) в FOR L oop, который работает нормально и пытается добраться до конечных точек и целей (2-й вызов API-интерфейса отдыха) в приведенном ниже коде.

Пожалуйста, помогите мне получить конечные точки и цели из второго вызова API отдыха.

Я вставил HTTP-ответ, который я получаю из второго вызова API отдыха.

Второй ответ 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"
    }

}

C# Метод получения значений из Azure Rest 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);
                    }
                }
            }
        }

enter image description here

1 Ответ

0 голосов
/ 20 июня 2020

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