我在客户端时收到AggregateException。PostAsyc呼叫连我都设置了长超时。
这是我的密码。
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何时超时?
AggregateException在等待PostAsJsonAsync 时引发
HttpClient.Timeout和使用WebRequestHandler超时属性有什么区别?
将async
添加到方法定义中,并使用await
而不是.Result
。
使用.Result
会阻塞线程,并且您将失去使用Async方法的所有弯曲。
使用await
不仅会"打开"数据,还会打开异常(因此您将获得实际的异常,而不是AggregateException)。
var result = await client.PostAsync(session.Values["URL"] + "/abcd/", contents);
...
string data = await result.Content.ReadAsStringAsync();
它有点长,但这里有一个关于使用async/await的好视频:https://channel9.msdn.com/Events/aspConf/aspConf/Async-in-ASP-NET
值得一看。
如果你只想在不做任何处理的情况下检查遇到的异常是什么,你可以做这样的事情:
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())
}