Как узнать, с какой точки запускается отмена задачи HttpClient

У меня есть следующий код для получения токена носителя, а затем вызова веб-API в приложении С#.

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;
}

Проблема, с которой я сталкиваюсь, заключается в том, что иногда этот код выдает исключение, говорящее, что «Задача была отменена» время от времени, а не каждый раз. Я искал в Интернете и наткнулся на этот ответ. Поэтому я проверил, отменяется ли задача. Затем я увеличил время ожидания до 30 минут, как указано в этом ответе.

Теперь странно то, что задача ждет 30 минут (или любой другой тайм-аут, который мы указали), а затем выдает исключение «Задача была отменена». Это сводит меня с ума.

Я хочу знать, почему задача отменяется, когда мы не запрашиваем ее явно, и кто или откуда отменяет задачу? Есть ли способ найти источник запроса на отмену?

Любая помощь в этом отношении высоко ценится, так как я не могу понять проблему.

Предположим, что все переменные имеют правильные значения, хотя это не упоминается здесь.

ИЗМЕНИТЬ

Сообщение об исключении:

Задача была отменена.

Это трассировка стека исключений:

Исключение StackTrace: в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в System.Net.Http.HttpClient.d__58.MoveNext() --- Конец трассировка стека из предыдущего места, где было выдано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter`1 .GetResult() в SampleProject.d__2.MoveNext() в C:\Users\SampleProject\HttpHelper.cs: строка 145 --- Конец трассировки стека из предыдущего места, где было выдано исключение ---


person CrazyCoder    schedule 02.11.2018    source источник
comment
не могли бы вы попробовать использовать информацию о приложении для мониторинга вашего приложения? Он может записать какую-то полезную информацию, может быть, сможет найти причину.   -  person Ivan Yang    schedule 02.11.2018
comment
Не создавайте постоянно HttpClient, создайте один экземпляр и используйте его повторно. Что касается исключения, то где оно? Опубликуйте полное исключение в вопросе, возвращенное Exception.ToString(). Он содержит стек вызовов и любые внутренние исключения. Однако 30-минутный тайм-аут предполагает, что что-то не так с кодом или сервером. Увеличение времени просто скрывает проблему, но не решает ее.   -  person Panagiotis Kanavos    schedule 02.11.2018
comment
@PanagiotisKanavos Я включил детали исключения в вопрос. Внутреннее исключение было пустым.   -  person CrazyCoder    schedule 02.11.2018
comment
Опубликуйте полное исключение, а не только те части, которые вы считаете важными.   -  person Panagiotis Kanavos    schedule 02.11.2018
comment
Что это .TaskAwaiter`1.GetResult() ? Вы блокируете асинхронный вызов? Что находится в HttpHelper.cs строке 145? Это определенно не тот код, который вы разместили здесь. Скорее всего, вы блокируете свой собственный код, блокируя асинхронный вызов, а не ожидая его.   -  person Panagiotis Kanavos    schedule 02.11.2018
comment
В строке 145 это строка response = await client.SendAsync(httpRequest);   -  person CrazyCoder    schedule 02.11.2018