Сбой запроса HttpClient иногда в C # - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть аналогичный код в моем приложении c # windows.

public async Task<HttpResponseMessage> SendHttpRequest()
{
    HttpResponseMessage response = null;
    try
    {
        HttpClient client = new HttpClient();
        string accessToken = await GetBearerToken(resourceUrl, clientId, clientSecret, tokenProviderUrl);
        if (!string.IsNullOrEmpty(accessToken))
            httpRequest.Headers.Add("Authorization", ("Bearer " + accessToken));

        response = await client.SendAsync(httpRequest);
    }
    catch(Exception ex)
    {
        log.Error("Exception raised while sending HTTP request");
        log.Error("Exception details : " + ex.Message);
    }           

    return response;
}

public async Task<string> GetBearerToken()
{           
    HttpResponseMessage response = null;
    HttpClient client = new HttpClient();
    string token = "";
    try
    {
        var request = new HttpRequestMessage(HttpMethod.Post, tokenProviderUrl);
        request.Content = new FormUrlEncodedContent(new Dictionary<string, string> {
            { "client_id",clientId},
            { "client_secret", clientSecret },
            { "grant_type", "client_credentials" },
            { "resource", resource },
        });

        response = await client.SendAsync(request);                
        var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
        token = payload.Value<string>("access_token");                
    }
    catch (HttpRequestException ex)
    {
        log.Error("Error in GetToken : " + ex.Message.ToString());
    }
    return token;
}

Приведенный выше код прекрасно работает в большинстве случаев. Но время от времени он выдает исключение, говорящее «Задача была отменена». Поэтому, основываясь на нескольких вопросах и статьях, я понял, что для этого может быть две причины.
1. Тайм-аут запроса.
2. Или запрос был фактически отменен.

Я проверил эту переменную - CancellationToken.IsCancellationRequested. Он вернулся ложным. Итак, я предполагаю, что это проблема тайм-аута. Чтобы установить этот тайм-аут, я также проверил разницу во времени между запущенным запросом и выданным исключением. Это ровно 100 секунд (это время по умолчанию для httpClient).

Теперь, когда я повторяю тот же запрос сразу через 5-10 секунд, он возвращает успех. Поскольку эта проблема возникает не для каждого запроса, я немного запутался в том, что происходит.

Один и тот же запрос успешно выполнялся в 95% случаев, а в остальных 5% случаев он говорит, что задача была отменена.

Есть ли сценарий, когда одна и та же задача выполняется один раз и отменяется один раз.

Я отправил запрос через почтальона на веб-API, и не один раз я получил эту проблему. Это только через приложение Windows, я сталкиваюсь с этим.

Есть ли что-то, что я пропускаю. Любая помощь высоко ценится. Спасибо

РЕДАКТИРОВАТЬ

Внутреннее исключение равно нулю.

Трассировка стека: в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task задача) в System.Net.Http.HttpClient.d__58.MoveNext () --- Конец стека трассировки из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task задача) в System.Runtime.CompilerServices.TaskAwaiter`1.GetResult ()

1 Ответ

0 голосов
/ 07 марта 2019

вы не должны создавать новый HttpClient каждый раз, когда хотите опубликовать. создайте новый HttpClient в вашем основном методе и просто передайте его "SendHttpRequest". У меня были похожие проблемы с отменой задачи, поэтому я искал некоторые и использовал это. у меня это сработало

HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
        client.DefaultRequestHeaders.Add("Keep-Alive", "false");
        client.Timeout = TimeSpan.FromMinutes(20);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...