Web Api 的 PostAsync HttpClient 错误 - System.AggregateException“任务已取消。”

Posted

技术标签:

【中文标题】Web Api 的 PostAsync HttpClient 错误 - System.AggregateException“任务已取消。”【英文标题】:PostAsync HttpClient error with Web Api - System.AggregateException "A task was canceled." 【发布时间】:2013-05-13 08:15:21 【问题描述】:

我正在尝试使用来自 Web API 的 System.Net.Http.HttpClient 调用 PostAsync 方法。我收到以下错误:

System.AggregateException "任务已取消。"

任务:

Id = 1,状态 = System.Threading.Tasks.TaskStatus.Canceled,方法 = “null”,结果 = “尚未计算”

代码:

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。

【问题讨论】:

【参考方案1】:

我遇到了同样的错误,并追踪到我的 HttpClient 超时。默认超时为 100 秒。我在 HttpClient 的创建中添加了以下内容。

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

【讨论】:

【参考方案2】:

在调试方面,您可以尝试编写扩展方法来获取异常:

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;
            
        

【讨论】:

调试技巧就像一个魅力,我检测到我的 AV 软件让我很难使用 https 证书,并且办公网络在 Azure 请求方面有问题!【参考方案3】:

不同步,第二个任务也将异步执行,但与第一个任务链接,因此只有在第一个任务执行之后。

似乎是第一个任务 - PostAsync 执行时出错。尝试从AggregateException 捕获 TPL 聚合异常并在内部异常集合中找到更多详细信息 例如here 或订阅TaskScheduler.UnobservedTaskException 并在那里记录你所有的异常

【讨论】:

以上是关于Web Api 的 PostAsync HttpClient 错误 - System.AggregateException“任务已取消。”的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net Web Api HttpClient 强类型 PostAsync

ASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码

Web Api 的 PostAsync HttpClient 错误 - System.AggregateException“任务已取消。”

使用 httpClient.postasync 进行 web api 调用 .net core

HttpClient PostAsync 到 Blogger API

HTTPC1-Web及网络基础