2016-12-13 1 views
3

Comment faire pour relancer HttpClient et lui faire voir que le réseau est disponible à nouveau sans redémarrer complètement l'application?Comment faire pour relancer HttpClient après la restauration de la connexion réseau?

Dans le cas où une application Xamarin.Forms a été lancée sans connexion réseau disponible et puis plus tard la connexion réseau est activée, HttpClient.SendAsync(request) lancers francs NameResolutionFailure et il ne récupère pas, peu importe combien de fois la demande est répétée.

Il semble que HttpClient ne sait pas comment récupérer lorsque la connexion réseau apparaît.

Pour reproduire le problème dans l'émulateur Android:

  • vous assurer que votre application est complètement fermé
  • réseau Désactiver (définir l'état des données à l'itinérance dans les paramètres de l'émulateur ou utilisez la barre d'état pour activer les données ou LTE commutateur).
  • lancer votre application, exécutez une requête Web pour vérifier qu'il ne fonctionne pas (évidemment, vous aurez besoin try/catch autour de la demande Web pour éviter de s'écraser)
  • lorsque l'application est toujours ouverte, permettre au réseau
  • exécuter une requête Web - va se NameResolutionFailure
  • seulement plein redémarrage de l'application ressuscitera HttpClient

Le problème ne se produit pas si j'utilise des noms de domaine spécifiés dans etc/hosts.

J'ai essayé de recréer entièrement HttpClient et de renvoyer une nouvelle requête lorsque le problème survient, mais cela n'aide pas. Seul le redémarrage complet de l'application aide. Évidemment, je ne peux pas demander à l'utilisateur de tuer complètement mon application et de la redémarrer chaque fois que l'utilisateur a allumé sa connexion réseau après en lançant mon application.

+0

se fait-il sur l'émulateur uniquement ou sur un vrai appareil aussi? –

+0

Oui, juste reproduit sur HTC One M8S avec Android 6.0 API 23. Collègues rapportent, ils ont reproduit le problème également sur un vrai iPhone. J'ai trouvé quelques messages sur les forums Xamarin qui mentionnaient qu'il y avait un bug dans Mono et que ça aurait dû être corrigé, mais apparemment ce n'est pas le cas. Il semble qu'une solution astucieuse pourrait être nécessaire. – JustAMartin

+0

Utilisez-vous System.Http ou Microsoft.Http nuget? –

Répondre

2

Ceci est un problème connu. Voir:

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

La solution consiste à définir manuellement la mise à jour DNS:

System.Net.ServicePointManager.DnsRefreshTimeout = 0; 
+0

Merci, cela semble fonctionner. J'espère juste que ce délai ne ralentira pas les demandes, mais pour l'instant je n'ai rien remarqué d'inhabituel. – JustAMartin

+0

Si je comprends correctement les notes de bugzilla, ceci est corrigé dans Mono> 4.8.0 –