如何管理 PostAsync 调用时抛出的 AggregateException?

问题描述 投票:0回答:2

即使我设置了很长的超时,我在 client.PostAsyc 调用时也会收到 AggregateException。

这是我的代码。

try
{
    StoresList objlist = new StoresList();
    Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
    Windows.Storage.ApplicationDataContainer session = Windows.Storage.ApplicationData.Current.RoamingSettings;

    var contents = new FormUrlEncodedContent(new[] 
        {
            new KeyValuePair<string, string>("userapi", session.Values["userapi"].ToString()),
            new KeyValuePair<string, string>("keyapi", session.Values["keyapi"].ToString()),
            new KeyValuePair<string, string>("notification_flag","1"),                 
            new KeyValuePair<string, string>("token", localSettings.Values["deviceid"].ToString()),
        });

    using (var client = new HttpClient()  { Timeout = TimeSpan.FromMinutes(4) } )
    {
        var result = client.PostAsync(session.Values["URL"] + "/abcd/", contents).Result;

        if (result.IsSuccessStatusCode)
        {
            string data = result.Content.ReadAsStringAsync().Result;
            if (data.Contains("activate") || data.Contains("enable"))
            {
                //Please activate the Mobile Assistant Extension 
                return null;
            }

            if (data != null)
            {
                List<Stores> objStores = JsonConvert.DeserializeObject<LoginResponse>(data).stores;

                foreach (var item in objStores)
                {
                    Stores objs = new Stores();
                    {
                        objs.id = item.id;
                        objs.name = item.name;
                        objlist.Add(objs);
                    }
                }
            }

        }
    }
    return objlist;
}
catch (Exception ex)
{
    throw ex;
    return null;
}

有人可以建议如何管理这个问题吗?有时我会遇到 AggregateException。

我已经参考了以下链接,但仍然出现错误。事件我设置了超时。

如何判断 HttpClient 何时超时?

等待 PostAsJsonAsync 时抛出 AggregateException

HttpClient.Timeout 和使用 WebRequestHandler 超时属性有什么区别?

c# timeout dotnet-httpclient
2个回答
5
投票

async
添加到您的方法定义中,并使用
await
代替
.Result

使用

.Result
会阻塞线程,并且你会失去使用异步方法的所有好处。

使用

await
不仅可以“解开”数据,还可以解开异常(因此您将得到一个实际的异常,而不是 AggregateException)。

var result = await client.PostAsync(session.Values["URL"] + "/abcd/", contents);

...

string data = await result.Content.ReadAsStringAsync();

0
投票

AggregateException 是执行异步任务时遇到的所有异常的集合。

如果你只是想检查遇到的异常是什么而不做任何处理,你可以这样做:

catch (AggregateException ae)
{
    // This will just throw the first exception, which might not explain everything/show the entire trace.
    throw ae.InnerException
}

catch (AggregateException ae)
{
    // This will flatten the entire exception stack to a string.
    throw new Exception(ae.ToString())
}
© www.soinside.com 2019 - 2024. All rights reserved.