2016-10-19 4 views
3

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

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

Проблема, которую я пытаюсь выяснить, A) В чем разница между 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) .... 

ответ

3

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

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

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

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

+1

Где вы поместили эту строку кода? Я получаю «Тип или имя пространства имен« ServicePointManager »не существует в пространстве имен« System.Net » – jdmdevdotnet

+0

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

+0

Да, вы должны поместить его в код платформы, как из X.F, к которому вы не можете получить доступ. – Theos

2

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

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

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

+0

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

+0

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

+0

Я только что подтвердил эту проблему на iOS и в моно-консольном проекте. Подаются новые отчеты об ошибках. Я буду предоставлять ссылки, когда это будет сделано. – jgoldberger

 Смежные вопросы

  • Нет связанных вопросов^_^