В настоящее время я работаю над приложением 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 .