Как восстановить HttpClient после восстановления сетевого подключения?

Как оживить HttpClient и заставить его видеть, что сеть снова доступна без полного перезапуска приложения?

В случае, когда приложение Xamarin.Forms было запущено без доступного сетевого подключения, а затем позднее было включено сетевое подключение, HttpClient.SendAsync(request) бросает NameResolutionFailure и он не восстанавливается, независимо от того, сколько раз запрос повторяется.

Кажется, HttpClient не знает, как восстановить, когда появляется сетевое соединение.

Чтобы воспроизвести проблему в эмуляторе Android:

  • убедитесь, что ваше приложение полностью закрыто
  • выключите сеть (установите для параметра "Состояние данных" значение "Роуминг" в настройках эмулятора или используйте строку состояния для переключения данных или переключателя LTE).
  • запустите ваше приложение, запустите веб-запрос, чтобы убедиться, что оно не работает (очевидно, вам нужно будет попытаться обойти веб-запрос, чтобы избежать сбоев)
  • пока приложение еще открыто, включите сеть
  • запустите веб-запрос - получите NameResolutionFailure
  • только полный перезапуск приложения оживит HttpClient

Проблема не возникает, если я использую доменные имена, указанные в файле etc / hosts.

Я пытался полностью воссоздать HttpClient и повторно отправить новый запрос, когда проблема возникает, но это не помогает. Помогает только полная перезагрузка приложения. Очевидно, что я не могу попросить пользователя полностью убить мое приложение и запускать его снова каждый раз, когда пользователь включил свое сетевое соединение после запуска моего приложения.

1 ответ

Решение

Это известная проблема. Увидеть:

Моно: https://bugzilla.xamarin.com/show_bug.cgi?id=45761

iOS: https://bugzilla.xamarin.com/show_bug.cgi?id=45763

Android: https://bugzilla.xamarin.com/show_bug.cgi?id=45383

Обходной путь должен вручную установить обновление DNS:

System.Net.ServicePointManager.DnsRefreshTimeout = 0;
Другие вопросы по тегам