Ошибка NameResolutionFailure против проблемы ConnectFailure

#xamarin #dns #httpclient

#xamarin #dns #httpclient

Вопрос:

Так что это довольно своеобразная проблема, но, тем не менее, довольно серьезная. Когда пользователь заходит в наше приложение вообще без Интернета, мы получаем обратно a NameResolutionFailure в качестве сообщения об ошибке при попытке выполнить вызов API через HttpClient . Ладно, это прекрасно. Проблема, однако, в том, что когда пользователь затем подключается к Интернету, возвращается в приложение и пытается выполнить другой вызов API, мы получаем то же сообщение об ошибке. Похоже, что происходит какое-то кэширование DNS?

С другой стороны, если пользователь ИМЕЕТ доступ в Интернет во время работы в приложении, а затем теряет его, то при попытке выполнить вызов API мы получаем ConnectFailure(Network is unreachable) ошибку от вызова API. И как только пользователь подключается к Интернету, он может мгновенно выполнять вызовы API.

Проблема, которую я пытаюсь выяснить, заключается в следующем: А) В чем разница между NameResolutionFailure и ConnectFailure ? и Б) Можем ли мы что-нибудь сделать в приложении, чтобы заставить его полностью повторить вызов API без использования какого-либо кэша? Для меня не очевидно, кэшируется DNS или нет, но у нас есть предчувствие, что именно это и происходит.

Вот часть кода (если вам нужно больше, дайте мне знать, я решил, что это единственный необходимый код)

 using(var client = new HttpClient())
{
   client.Timeout = TimeSpan.FromSeconds(MaximumWebRequestTime);    
   HttpResponseMessage response = null;
   try
   {
      response = await client.GetAsync(URL);
      if (response.IsSuccessStatusCode) ....
  

Ответ №1:

Только что была эта проблема и на iOS, и исправила ее, установив время ожидания обновления DNS:

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

Это временное исправление, но пока работает. Еще не тестировал его на Android. Сделает это слишком быстро.

Редактировать: Android успешно протестирован.

Комментарии:

1. Куда вы поместили эту строку кода? Я получаю The type or namespace name 'ServicePointManager' does not exist in the namespace 'System.Net'

2. Wow выглядит законно. Я поместил это в AppDelegate, поскольку я не могу получить доступ к материалам .Net в XF. И… это сработало! По крайней мере, с первой попытки. Собираюсь протестировать больше, но спасибо, приятель!

3. Да, вы должны поместить это в код платформы, начиная с X.Если вы не можете получить к этому доступ.

Ответ №2:

Я только что зарегистрировал ошибку в этом недавно:http://bugzilla.xamarin.com/show_bug.cgi?id=45383

Это регрессия в версии Xamarin Android > = 7.0. Вы можете обойти это, понизив версию до Xamarin Android 6.1.2.21. И поскольку это регрессия, она должна быть приоритетной и исправляться относительно быстро.

Примечание: я инженер службы поддержки MS / Xamarin

Комментарии:

1. На самом деле мы видим эту ошибку в iOS. Возможно ли, что существует более серьезная проблема, которая затрагивает все платформы?

2. Это определенно кажется немного более широкой проблемой, чем просто Android (хотя может быть связано). Я опубликовал это ( forums.xamarin.com/discussion/comment/228788#Comment_228788 ) на форумах Xamarin, и у пары человек такая же проблема с Xamarin iOS.

3. Я только что подтвердил эту проблему на iOS и в проекте Mono console. Отправляются новые отчеты об ошибках. Я предоставлю ссылки, когда закончу.

4. Отчеты об ошибках Android и iOS были помечены как дубликат отчета об ошибке Mono, поскольку именно там ошибка действительно есть, в Mono > = 4.6.0

5. Тьфу, так расстраивает. Каким бы хорошим ни был Xamarin, определенно есть возможности для улучшения. Но спасибо за вашу помощь!