static void Main(string[] args)
        {
            services = new ServiceCollection();
            //// Startup.cs finally :)
            Startup startup = new Startup();

            startup.ConfigureServices(services);
            serviceProvider = services.BuildServiceProvider();
            var idsvrSetting = new IdentityServerSetting();


            DataTable workTable = new DataTable("Results");


            var Configuration = serviceProvider.GetService <IConfigurationRoot>();

            Configuration.GetSection("IdentityServerSetting").Bind(idsvrSetting);
            Configuration.GetSection("Settings").Bind(settings);

            lstServerCheck = Configuration.GetSection("ServerChecks").Get <List <ServerCheck> >();
            try
            {
                CallHealthCheck(idsvrSetting).Wait();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"There was an exception: {ex.ToString()}");
            }
            Console.WriteLine("All servers processed.");
            Console.ReadLine();
        }
        public static async Task <string> CallHealthCheck(IdentityServerSetting idsvrcSetting)
        {
            //specify to use TLS 1.2 as default connection
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

            ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) =>
            {
                return(true);
            };
            var proxy = new WebProxy()
            {
                Address = new Uri("http://proxy.aetna.com:9119"),
                UseDefaultCredentials = false,

                // *** These creds are given to the proxy server, not the web server ***
                Credentials = new NetworkCredential(settings.ProxyUserName, settings.ProxyPwd)
            };

            var httpClientHandler = new HttpClientHandler()
            {
                //  Proxy = proxy,
                ServerCertificateCustomValidationCallback = (o, c, ch, er) =>
                {
                    return(true);
                }
            };


            //var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();

            // get the http client
            //var client = new HttpClient();
            var client = new HttpClient(handler: httpClientHandler, disposeHandler: true);


            // discover endpoints from metadata
            var oidcDiscoveryResult = await DiscoveryClient.GetAsync(idsvrcSetting.IdentityServerUrl);

            if (oidcDiscoveryResult.IsError)
            {
                Console.WriteLine(oidcDiscoveryResult.Error);
                return(oidcDiscoveryResult.Error);
            }

            //Console.WriteLine(tokenResponse.Json);
            //Console.WriteLine("\n\n");

            Dictionary <string, Result> allresults = new Dictionary <string, Result>();
            int i = 0;

            //  http://localhost:19641/api/HealthCheck/fileinfo
            foreach (ServerCheck chk in lstServerCheck)
            {
                if (chk.Type == "UMPortalWeb")
                {
                    // request token
                    var tokenClient   = new TokenClient(oidcDiscoveryResult.TokenEndpoint, idsvrcSetting.APIClientId, idsvrcSetting.APIClientSecret);
                    var tokenResponse = await tokenClient.RequestClientCredentialsAsync(idsvrcSetting.ResourceAPIName);

                    if (tokenResponse.IsError)
                    {
                        Console.WriteLine(tokenResponse.Error);
                        throw new HttpRequestException(tokenResponse.Error);
                    }
                    else
                    {
                        client.SetBearerToken(tokenResponse.AccessToken);
                    }
                }

                if (chk.Type == "AAWebServices")
                {
                    client.SetBasicAuthentication(settings.AAWebservicesUserName, settings.AAWebservicesPwd);
                }


                //new datatable for each server;
                var tableResults = new DataTable();

                // Create the table definition
                tableResults.Columns.Add("Server");
                foreach (string strdll in chk.DLLFiles)
                {
                    tableResults.Columns.Add(new DataColumn(strdll));
                }
                foreach (string strconfig in chk.ConfigFiles)
                {
                    tableResults.Columns.Add(new DataColumn(strconfig));
                }

                foreach (string server in chk.Servers)
                {
                    var row = tableResults.NewRow();
                    row["Server"] = server;

                    int           colnum     = 0;
                    List <string> lstResults = new List <string>();

                    //Get the dll file info for all servers at the same time
                    string infoUrl = GetFileInfoUrl(server, chk.DLLFiles, chk.Type);
                    try
                    {
                        var response = await client.GetAsync(infoUrl);

                        if (!response.IsSuccessStatusCode)
                        {
                            Console.WriteLine(response.StatusCode);
                            throw new HttpRequestException(response.StatusCode.ToString());
                        }
                        else
                        {
                            var content = await response.Content.ReadAsStringAsync();

                            JArray result = JArray.Parse(content);

                            foreach (JObject item in result)
                            {
                                if (chk.Type == "UMPortal" || chk.Type == "UMPortalWeb")
                                {
                                    string name                = item.GetValue("fileName").ToString();
                                    string creationTimeUTC     = item.GetValue("creationTimeUTC").ToString();
                                    string lastModifiedTimeUTC = item.GetValue("lastModifiedTimeUTC").ToString();
                                    string assembleName        = item.GetValue("assemblyName").ToString();

                                    row[++colnum] = name + ":" + lastModifiedTimeUTC + ":" + assembleName;
                                }
                                else
                                {
                                    string name                = item.GetValue("FileName").ToString();
                                    string creationTimeUTC     = item.GetValue("CreationTimeUTC").ToString();
                                    string lastModifiedTimeUTC = item.GetValue("LastModifiedTimeUTC").ToString();
                                    string assembleName        = item.GetValue("AssemblyName").ToString();

                                    row[++colnum] = name + ":" + lastModifiedTimeUTC + ":" + assembleName;
                                }
                            }

                            //    Console.WriteLine(content);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    //Get the config files in the for loop
                    try
                    {
                        if (chk.ConfigFiles.Length > 0)
                        {
                            Dictionary <string, string> lstconfig = new Dictionary <string, string>();
                            foreach (string file in chk.ConfigFiles)
                            {
                                string fileUrl      = GetFileUrl(server, file, chk.Type);
                                var    responseFile = await client.GetAsync(fileUrl);

                                if (!responseFile.IsSuccessStatusCode)
                                {
                                    Console.WriteLine(responseFile.StatusCode);
                                    throw new HttpRequestException(responseFile.StatusCode.ToString());
                                }
                                else
                                {
                                    var content = await responseFile.Content.ReadAsStringAsync();

                                    row[++colnum] = content;
                                    //   Console.WriteLine(content);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    tableResults.Rows.Add(row);
                }
                ExportDatatableToHtml(tableResults, chk.Name);
            }
            return("");
        }