#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, определенно есть возможности для улучшения. Но спасибо за вашу помощь!