2016-12-13 2 views
3

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

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

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

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

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

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

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

+0

Происходит ли это на эмуляторе или только на реальном устройстве тоже? –

+0

Да, только что воспроизведено на HTC One M8S с Android 6.0 API 23. Коллеги сообщают, что они воспроизвели эту проблему и на реальном iPhone. Я нашел несколько связанных сообщений на форумах Xamarin, в которых упоминалось, что в Mono есть ошибка, и к настоящему времени это должно быть исправлено, но, видимо, это не так. Кажется, может потребоваться какое-то умное обходное решение. – JustAMartin

+0

Вы используете System.Http или Microsoft.Http nuget? –

ответ

2

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

Mono: 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; 
+0

Спасибо, это работает. Я просто надеюсь, что этот тайм-аут не замедлит запросы, но на данный момент я не заметил ничего необычного. – JustAMartin

+0

Если я правильно понимаю заметки из bugzilla, это фиксируется в Mono> 4.8.0 –