示例#1
0
        public async Task AppendQueryToFileWorker(string query)
        {
            long records = 0;

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(ServerUrl);
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + FhirAuth.GetAuthenticationResult().AccessToken);

                HttpResponseMessage getResult = getResult = await client.GetAsync(query);

                JObject bundle  = JObject.Parse(await getResult.Content.ReadAsStringAsync());
                JArray  entries = (JArray)bundle["entry"];

                JArray links     = (JArray)bundle["link"];
                string nextQuery = "";
                for (int i = 0; i < links.Count; i++)
                {
                    string link_type = (string)(bundle["link"][i]["relation"]);
                    string link_url  = (string)(bundle["link"][i]["url"]);

                    if (link_type == "next")
                    {
                        Uri nextUri = new Uri(link_url);
                        nextQuery = nextUri.PathAndQuery;
                        break;
                    }
                }

                if (!String.IsNullOrEmpty(nextQuery))
                {
                    QueryQueue.Post(nextQuery);
                }

                if (entries != null)
                {
                    for (int i = 0; i < entries.Count; i++)
                    {
                        string entry_json = (((JObject)entries[i])["resource"]).ToString(Formatting.None);
                        if (Anom != null)
                        {
                            entry_json = await Anom.AnonymizeDataAsync(entry_json);
                        }
                        AppendToFile(FileName, entry_json);
                        records++;
                    }
                }

                if (String.IsNullOrEmpty(nextQuery))
                {
                    QueryQueue.Complete();
                }
            }
        }
示例#2
0
        public async Task AppendQueryWorker(string query)
        {
            var randomGenerator = new Random();

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(ServerUrl);
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + FhirAuth.GetAuthenticationResult().AccessToken);

                HttpResponseMessage getResult = getResult = await client.GetAsync(query);

                JObject bundle  = JObject.Parse(await getResult.Content.ReadAsStringAsync());
                JArray  entries = (JArray)bundle["entry"];

                JArray links     = (JArray)bundle["link"];
                string nextQuery = "";
                for (int i = 0; i < links.Count; i++)
                {
                    string link_type = (string)(bundle["link"][i]["relation"]);
                    string link_url  = (string)(bundle["link"][i]["url"]);

                    if (link_type == "next")
                    {
                        Uri nextUri = new Uri(link_url);
                        nextQuery = nextUri.PathAndQuery;
                        break;
                    }
                }

                if (!String.IsNullOrEmpty(nextQuery))
                {
                    QueryQueue.Post(nextQuery);
                }

                if (entries != null)
                {
                    for (int i = 0; i < entries.Count; i++)
                    {
                        JObject resource     = (JObject)entries[i]["resource"];
                        string  resourceType = resource["resourceType"].ToString();
                        string  resourceId   = resource["id"].ToString();
                        string  deleteQuery  = $"/{resourceType}/{resourceId}?hardDelete=true";

                        var pollyDelays =
                            new[]
                        {
                            TimeSpan.FromMilliseconds(2000 + randomGenerator.Next(50)),
                            TimeSpan.FromMilliseconds(3000 + randomGenerator.Next(50)),
                            TimeSpan.FromMilliseconds(5000 + randomGenerator.Next(50)),
                            TimeSpan.FromMilliseconds(8000 + randomGenerator.Next(50))
                        };


                        HttpResponseMessage deleteResult = await Policy
                                                           .HandleResult <HttpResponseMessage>(response => !response.IsSuccessStatusCode)
                                                           .WaitAndRetryAsync(pollyDelays, (result, timeSpan, retryCount, context) =>
                        {
                            Console.WriteLine($"Request failed with {result.Result.StatusCode}. Waiting {timeSpan} before next retry. Retry attempt {retryCount}");
                        })
                                                           .ExecuteAsync(() =>
                        {
                            return(client.DeleteAsync(deleteQuery));
                        });

                        if (!deleteResult.IsSuccessStatusCode)
                        {
                            Console.WriteLine("Delete failed: " + deleteQuery);
                            throw new Exception("Failed to delete resource");
                        }
                        else
                        {
                            Console.WriteLine("DELETE " + deleteQuery);
                        }
                    }
                }

                if (String.IsNullOrEmpty(nextQuery))
                {
                    QueryQueue.Complete();
                }
            }
        }