Сбой разрешения DNS в HttpClient выдает Unhandled AggregateException

У меня есть клиентское приложение .NET 4, использующее HttpClient. Когда _tokenServiceUrl не разрешается правильно через DNS (например, изменение сети происходит, когда VPN работает или отключается, или когда мобильные устройства теряют подключение в мертвой зоне), возникает исключение AggregateException. Я пытаюсь поймать это исключение, но не могу.

    try
    {
        var response = _client.GetAsync(_tokenServiceUrl).Result;

        response.EnsureSuccessStatusCode();
        var token = response.Content.ReadAsAsync<string>().Result;
        return token;

    }
    catch (AggregateException exception)
    {
        Disconnected(exception);
        return string.Empty;
    }

Я возился с добавлением ContinueWith, чтобы перехватить исключение и обработать его, но я никогда не возвращаюсь. Что я могу сделать, чтобы убить задачу, учитывая такое исключение?


person Mike L    schedule 25.02.2014    source источник
comment
Вы должны быть в состоянии зафиксировать это исключение Aggregate. При тестировании убедитесь, что вы не используете Fiddler или какой-либо другой прокси-сервер. Если вы это сделаете, во время GetAsync не возникнет исключения. Вы просто получите ответ 502, а затем SureSuccessStatusCode выдаст исключение HttpRequestException.   -  person Darrel Miller    schedule 26.02.2014
comment
Просто работает через Visual Studio. AggregateException вызывается .Result. Он никогда не получает ответа.EnsureSuccessStatusCode(); линия.   -  person Mike L    schedule 26.02.2014
comment
Так почему же вы не можете поймать его тогда? У меня ловит нормально.   -  person Darrel Miller    schedule 26.02.2014
comment
Хм... ты прав. Я только что запустил консольное приложение, чтобы удалить весь остальной хлам, и оно меня тоже зацепило. Мне придется потратить время на изучение того, как мы внедряем HttpClient... или версию, которую мы используем через NuGet... или какой-то конфликт. В любом случае, напишите мне, что я дурак, и я соглашусь.   -  person Mike L    schedule 26.02.2014


Ответы (1)


Вы должны быть в состоянии зафиксировать это исключение Aggregate.

При тестировании убедитесь, что вы не используете Fiddler или какой-либо другой прокси-сервер. Если вы это сделаете, во время GetAsync не возникнет исключения. Вы просто получите ответ 502, а затем SureSuccessStatusCode выдаст исключение HttpRequestException.

person Darrel Miller    schedule 25.02.2014
comment
Выяснил больше... Visual Studio был настроен на прерывание, когда исключение: Thrown & User-unhandled. Если я отключу Thrown, он прекрасно перейдет к Catch. Мое тестовое консольное приложение по умолчанию было снято с отметки Thrown ... в этом была разница. К сожалению, если бы я перешел на следующую строку вместо того, чтобы предположить, что перехваченная ошибка Visual Studio была фатальной, она бы попала в блок Catch. - person Mike L; 26.02.2014
comment
@MikeL Мы все были там. :-) - person Darrel Miller; 26.02.2014
comment
Если у кого-то возникла та же проблема: просто продолжайте нажимать «Продолжить» или отключите (снимите отметку) флажок Common Language Runtime Exceptions в настройках исключений (Visual Studio). - person jdstaerk; 13.10.2016