C# / UWP / MVVM - Как обрабатывать исключения HttpClient, когда сервер недоступен - PullRequest
0 голосов
/ 03 апреля 2020

В настоящее время я работаю над приложением UWP, которое будет работать на Raspberry PI. Большую часть моего приложения можно использовать без подключения inte rnet, но некоторые его части зависят от выборки данных с локально запущенного сервера.

Моя проблема заключается в том, что, когда сервер отключен, я могу не обрабатывать исключения, вызванные HttpClient.

Чтобы избежать использования асин c задач в конструкторе ViewModel, я переместил его в метод OnLoaded в представлении.

Вот методы, которые я использую:

HomeAssistantView

private async void OnLoaded(object sender, RoutedEventArgs e)
{
    await ViewModel.LoadEntities();
}

HomeAssistantViewModel

public async Task LoadEntities()
{
    var entityList = await _homeAssistantService.LoadEntities();
    Switches = new ObservableCollection<HomeAssistantSwitchEntity>(entityList.OfType<HomeAssistantSwitchEntity>());
    Entities = new ObservableCollection<HomeAssistantEntity>(entityList.Where(entity =>!(entity is HomeAssistantSwitchEntity)));
}

HomeAssistantService

public async Task<List<HomeAssistantEntity>> LoadEntities()
{
    _client.BaseAddress = new Uri(_homeAssistantURL);
    _client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_homeAssistantToken}");
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    try
    {
        HttpResponseMessage response = await _client.GetAsync("api/states");
        if (response.IsSuccessStatusCode)
        {
            return DeserializeConfigFile(await response.Content.ReadAsStringAsync());
        }
    }
    catch (HttpRequestException e)
    {
        Debug.WriteLine(e.Message);
    }
    return new List<HomeAssistantEntity>();
}

Несмотря на то, что я добавил блок try, приложение вызывает System.Exception с сообщением "The server name or address could not be resolved". После отключения в настройках универсального типа c Exception Visual Studio сказала, что это тип HttpRequestException с сообщением An error occurred while sending the request.

В другой части моего приложения, где я использую API погоды, мне не удалось использовать NetworkInformation.GetInternetConnectionProfile(), чтобы проверить, есть ли доступное соединение inte rnet до отправки запроса, но здесь этот вариант не подходит. Кроме того, я думал об отправке ping на сервер перед попыткой получить данные, но, насколько мне известно, pinging недоступен на Windows 10 IoT Core .

1 Ответ

1 голос
/ 03 апреля 2020

Я понял, что вы не хотите, чтобы было выброшено исключение, верно? Если да, просто замените

catch (HttpRequestException e)
{
    Debug.WriteLine(e.Message);
}

на

catch (Exception e)
{
    Debug.WriteLine(e.Message);
}

, чтобы перехватить все возникающие исключения

...