ASP .NET Rest API Повторные вызовы другого API - PullRequest
0 голосов
/ 05 октября 2018

Как я могу совершать повторяющиеся вызовы URL-адреса по временным интервалам, пока не получу успешный результат или тайм-аут?

Я загружаю файл в API, и он отправляет мне URL, чтобы я мог проверить, является ли мой файлобработано успешно.Я хочу сделать так, чтобы этот URL проверялся на сервере, пока не будет изменен статус ожидания.Есть статусы successful, failed и pending.Я хочу, чтобы пользователь ждал, пока результат не будет успешным или неудачным.

[HttpGet]
public async Task<ActionResult> Get()
{
    ...
    response = await client.GetAsync(other_api_url);

    if(response.IsSuccessStatusCode)
    {
        string result = response.Content.ReadAsStringAsync().Result;
        dynamic output = JsonConvert.DeserializeObject<dynamic>(result);

        statusUrl = output.url_to_check_status;

        //make a call to statusUrl check if content is ready
        //get result and parse it
        ...

        status = output.status;

        if(status == "SUCCESS")
        {
            //good path
            return Ok();
        }
        else
        {
            //make another call after n seconds to check again
        }
    }

    return NotFound();
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вы можете использовать цикл с Task.Delay, например:

bool done = false;
while (!done)
{
    await Task.Delay(1000);
    done = await GetStatusFromServerAsync();
}

Хотя вам может потребоваться таймаут:

async Task<bool> CheckForCompletion(int timeoutms)
{
    var timer = StopWatch.StartNew();
    while (timer.ElapsedMilliseconds < timeoutms)
    {
        var ok = await GetStatusFromServerAsync();
        if (ok) return true;
        await Task.Yield(1000);
    }
    return false;
}
0 голосов
/ 05 октября 2018

Не то чтобы я согласился на это (вы никогда не должны блокировать ваш запрос таким образом), но я думаю, что это должно решить вашу проблему:

[HttpGet]
public async Task<ActionResult> Get()
{
    response = await client.GetAsync(other_api_url);

    if(response.IsSuccessStatusCode)
    {
        // DO NOT USE `.Result` within async method.
        string result = await response.Content.ReadAsStringAsync();
        dynamic output = JsonConvert.DeserializeObject<dynamic>(result);

        statusUrl = output.url_to_check_status;

        bool? result = null;
        while(result == null) result = await CheckIfSuccessfulAsync(statusUrl);

        if (result) return Ok();       
        return NotFound();
    }
}

// Does not *need* to be a separate method, it's just for better readability...
private async Task<bool?> CheckIfSuccessfulAsync(string statusUrl)
{    
    //make a call to statusUrl check if content is ready
    //get result and parse it
    ...

    status = output.status;

    if (status == "SUCCESS") return true;
    else if (status == "PENDING") return false;

    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...