C# 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

您好,我使用的HttpClient与此类似:

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);