PostAsync Web ApiでのHttpClientエラー - System.AggregateException "タスクがキャンセルされました。"

私は、Web APIからSystem.Net.Http.HttpClientを使用してPostAsyncメソッドを呼び出そうとしています。次のエラーが表示されます。

System.AggregateException "タスクがキャンセルされました。"

仕事:

Id = 1、Status = System.Threading.Tasks.TaskStatus.Canceled、Method = "{null}"、Result = "{未計算}"

コード:

using (HttpClientHandler handler = new HttpClientHandler())
{
    handler.Credentials = new NetworkCredential("MyUsername", "[email protected]");

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

        HttpContent content = new FormUrlEncodedContent(postData);

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

私はresponseTaskがメソッドを同期して実行するように強制するでしょうか?

WPFアプリケーションであり、ASP.NETではありません。

7

3 答え

私はこの同じエラーを取得し、私のHttpClientにそれを追跡してタイムアウトしていた。デフォルトのタイムアウトは100秒です。私はHttpClientの作成に以下を追加しました。

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

10
追加された

デバッグの面では、例外を取得する拡張メソッドを記述することができます:

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 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;
            }
        }
3
追加された

同期していない場合、2番目のタスクも非同期に実行されますが、1番目のタスクとチェーンされます。

最初のタスクと思われます - PostAsyncはエラーで実行されました。 TPLの集約された例外をキャッチし、 AggregateException から内部例外コレクションの詳細を見つけてみてください。 例えば、ここを参照するか、 TaskScheduler.UnobservedTaskException を購読してください。そこにすべての例外を記録してください

0
追加された