0

I have 2 projects. One of them aspnet core webapi and second one is console application which is consuming api.

Api method looks like:

        [HttpPost]
        public async Task<IActionResult> CreateBillingInfo(BillingSummary 
        billingSummaryCreateDto)
        {
            var role = User.FindFirst(ClaimTypes.Role).Value;
            if (role != "admin")
            {
                return BadRequest("Available only for admin");
            }        

            ... other properties
            billingSummaryCreateDto.Price = icu * roc.Price;
            billingSummaryCreateDto.Project =
                await _context.Projects.FirstOrDefaultAsync(x => x.Id == 
            billingSummaryCreateDto.ProjectId);

            await _context.BillingSummaries.AddAsync(billingSummaryCreateDto);
            await _context.SaveChangesAsync();

            return StatusCode(201);
        }

Console application which consuming api:

    public static async Task CreateBillingSummary(int projectId)
    {
        var json = JsonConvert.SerializeObject(new {projectId});
        var data = new StringContent(json, Encoding.UTF8, "application/json");

        using var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", await Token.GetToken());

        var loginResponse = await client.PostAsync(LibvirtUrls.createBillingSummaryUrl, 
        data);

        WriteLine("Response Status Code: " + (int) loginResponse.StatusCode);
        string result = loginResponse.Content.ReadAsStringAsync().Result; 
        WriteLine(result);
    }

Program.cs main method looks like:

    static async Task Main(string[] args)
    {
        if (Environment.GetEnvironmentVariable("TAIKUN_USER") == null ||
            Environment.GetEnvironmentVariable("TAIKUN_PASSWORD") == null ||
            Environment.GetEnvironmentVariable("TAIKUN_URL") == null)
        {
            Console.WriteLine("Please specify all credentials");
            Environment.Exit(0);
        }

        Timer timer = new Timer(1000); // show time every second
        timer.Elapsed += Timer_Elapsed;
        timer.Start();
        while (true)
        {
            Thread.Sleep(1000); // after 1 second begin
            await PollerRequests.CreateBillingSummary(60); // auto id
            await PollerRequests.CreateBillingSummary(59); // auto id
            Thread.Sleep(3600000); // 1hour wait again requests
        }

    }

Is it possible find all id and paste it automatically instead of 59 and 60? Ids from projects table. _context.Projects

Tried also approach using method which returns ids

    public static async Task<IEnumerable<int>> GetProjectIds2()
    {
        var json = await 
       Helpers.Transformer(LibvirtUrls.projectsUrl);
        List<ProjectListDto> vmList = 
        JsonConvert.DeserializeObject<List<ProjectListDto>>(json);

        return vmList.Select(x => x.Id).AsEnumerable(); // tried 
        ToList() as well
    }

and in main method used:

foreach (var i in await PollerRequests.GetProjectIds2())
                     new List<int> { i }
                         .ForEach(async c => await 
             PollerRequests.CreateBillingSummary(c));

for first 3 ids it worked but does not get other ones, tested with console writeline method returns all ids

Arzu Suleymanov
  • 671
  • 2
  • 11
  • 33

1 Answers1

1

First get all Ids:

var ids = await PollerRequests.GetProjectIds2();

Then create list of task and run all tasks:

var taskList = new List<Task>();
foreach(var id in ids)
    taskList.Add(PollerRequests.CreateBillingSummary(id));

await Task.WhenAll(taskList);
Mohsen Esmailpour
  • 11,224
  • 3
  • 45
  • 66