HttpClient-работа с агрегатными исключениями

Привет, я использую 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;
    }
}

но у меня возникают трудности с исключениями. Я добавил дополнительные блоки catch только для того, чтобы попытаться сделать шаг, но ни одна из точек останова не поймана ни в одном из блоков catch. Я понимаю, что с помощью Task исключение может произойти в другом потоке, чем вызывающий, поэтому исключение завернуто в контейнер aggregate, но я не уверен, что лучший способ справиться с этими исключениями есть.

например, я делаю запрос к веб-службе и определяю недопустимый параметр в запросе, и возникает исключение. Я хочу, чтобы мне удалось поймать совокупные исключения и посмотреть на innerexceptions, чтобы понять, почему запрос не удался и вернуть дружественное сообщение.

Итак, мой вопрос: каков наилучший способ поймать эти совокупные исключения и справиться с ними?

1 ответов


исключение по task.Result:

var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url).ContinueWith(task =>
{
    try
    {
        return task.Result;
    }
    catch (AggregateException ex)
    {
        throw ex;
    }
    catch (WebException ex)
    {
        throw ex;
    }       
    catch (Exception ex)
    {
        throw ex;
    }
});

лучше: проверьте, если задача неисправность перед обращением task.Result:

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

если вы на самом деле не делаете что-то в ContinueWith, вы можете просто пропустить это:

var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url);