Ошибка PostAsync HttpClient с веб-API — System.AggregateException Задача была отменена.

Я пытаюсь вызвать метод PostAsync, используя System.Net.Http.HttpClient из веб-API. Я получаю следующую ошибку:

System.AggregateException «Задача была отменена».

Задача:

Id = 1, Status = System.Threading.Tasks.TaskStatus.Canceled, Method = "{null}", Result = "{Еще не вычислено}"

Код:

using (HttpClientHandler handler = new HttpClientHandler())
{
    handler.Credentials = new NetworkCredential("MyUsername", "p@ssw0rd");

    using (HttpClient client = new HttpClient(handler))
    {
        var postData = new List<KeyValuePair<string, string>>();
        postData.Add(new KeyValuePair<string, string>("status", "Hello world"));

        HttpContent content = new FormUrlEncodedContent(postData);

        var responseTask = client.PostAsync(url, content).ContinueWith(
            (postTask) =>
            {
                postTask.Result.EnsureSuccessStatusCode();
            });
    }

Я предполагаю, что responseTask заставит метод работать синхронно?

Это приложение WPF, а не ASP.NET.


person pfeds    schedule 13.05.2013    source источник


Ответы (3)


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

public static HttpResponseMessage PostAsyncSafe(this HttpClient client, string requestUri, string content)
        {
            var requestContent = new StringContent(content, Encoding.UTF8, "application/x-www-form-urlencoded");
            return PerformActionSafe(() => (client.PostAsync(requestUri, requestContent)).Result);
        }

public static HttpResponseMessage PerformActionSafe(Func<HttpResponseMessage> action)
        {
            try
            {
                return action();
            }
            catch (AggregateException aex)
            {
                Exception firstException = null;
                if (aex.InnerExceptions != null && aex.InnerExceptions.Any())
                {
                    firstException = aex.InnerExceptions.First();

                    if (firstException.InnerException != null)
                        firstException = firstException.InnerException;
                }

                var response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content =
                        new StringContent(firstException != null
                                            ? firstException.ToString()
                                            : "Encountered an AggreggateException without any inner exceptions")
                };

                return response;
            }
        }
person Joanna Derks    schedule 13.05.2013
comment
Уловка отладки сработала как шарм, я обнаружил, что мое антивирусное программное обеспечение доставляет мне проблемы с сертификатами https, а в офисной сети есть проблема с запросами Azure! - person Мitke; 19.12.2019

Я получал ту же ошибку и отслеживал ее до того, как истекло время ожидания HttpClient. Время ожидания по умолчанию составляет 100 секунд. Я добавил следующее к созданию HttpClient.

HttpClient httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromMinutes(10);

person Ron    schedule 14.11.2014

Не синхронно, вторая задача также будет выполняться асинхронно, но в цепочке с первой задачей, поэтому только после выполнения первой задачи.

Вроде первая задача - PostAsync выполнился с ошибкой. Попробуйте перехватить агрегированные исключения TPL и найти более подробную информацию во внутренней коллекции исключений из AggregateException Например, как здесь или подпишитесь на TaskScheduler.UnobservedTaskException и записывайте туда все свои исключения

person Regfor    schedule 13.05.2013