首页 > 解决方案 > C#中的JSON格式问题

问题描述

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

我想做什么:我需要使用 C# 从 Azure Rest API获取 Azure TrafficManager ProfileNameEndpointNameTargetName 。我设法到达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);
                    }
                }
            }
        }

在此处输入图像描述

标签: c#jsonazurerestjson-deserialization

解决方案


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


推荐阅读