C# HttpClient-处理聚合异常
您好,我使用的HttpClient与此类似:C# HttpClient-处理聚合异常,c#,rest,exception-handling,httpclient,aggregateexception,C#,Rest,Exception Handling,Httpclient,Aggregateexception,您好,我使用的HttpClient与此类似: public static Task<string> AsyncStringRequest(string url, string contentType) { try { var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWit
public static Task<string> AsyncStringRequest(string url, string contentType)
{
try
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType));
return client.GetStringAsync(url).ContinueWith(task => {
return task.Result;
});
}
catch (AggregateException ex)
{
throw ex;
}
catch (WebException ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
}
公共静态任务AsyncStringRequest(字符串url、字符串contentType)
{
尝试
{
var client=新的HttpClient();
client.DefaultRequestHeaders.Accept.Add(新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType));
返回client.GetStringAsync(url).ContinueWith(任务=>{
返回任务。结果;
});
}
捕获(聚合异常)
{
掷骰子;
}
捕获(WebException ex)
{
掷骰子;
}
捕获(例外情况除外)
{
掷骰子;
}
}
但我很难处理例外情况。我添加了额外的接球挡块只是为了尝试和跨步投掷,但是没有一个断点被任何接球挡块抓住。我意识到使用任务时,异常可能发生在与调用方不同的线程上,因此异常被包装在聚合容器中,但我不确定处理这些异常的最佳方法是什么
例如,我向web服务发出请求,并在请求中指定一个无效参数,然后引发异常。我希望我能够捕获聚合异常并查看innerexceptions,以找出请求失败的原因并返回友好消息
因此,我的问题是,捕获这些聚合异常并处理它们的最佳方法是什么?引发异常的原因是: 更好:在访问之前检查任务是否: 如果您实际上没有在中执行某些操作,您可以简单地忽略它:
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url);
太好了,我将在下一个小时尝试!我知道这是一个老问题,但是有没有办法像捕获webexception时那样从aggregateexception获取http状态代码?@gdp:是的,您可以调用aggregateexception上的.Flatten,然后访问InnerExceptions属性并取出其中包含的webexception。
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url).ContinueWith(task =>
{
if (task.IsFaulted)
{
var ex = task.Exception;
}
else if (task.IsCancelled)
{
}
else
{
return task.Result;
}
});
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url);