2017-08-31 4 views
1

j'ai écrit le code suivant à l'aide HttpWebRequest (Délai d'attente = 2000) et Webproxy
Le code suivant toujours lancera une exception en raison de mauvais url (« ww.google.com »)exception délai d'attente ne se produit pas à temps

Quand je lance le programme, je reçois deux types d'exception alternativement
1. le serveur distant a renvoyé une erreur: (404) Introuvable (exception Web)
=> Il faut moins de 2000ms pour attraper cette exception
=> Cette gestion des exceptions est normale.
.
2. Une tentative de connexion a échoué car le parti connecté n'a pas correctement répondu après une période de temps ou hôte connecté n'a pas répondu (Exception Socket)
=> Il faut 25 secondes pour attraper cette exception
=> J'ai mis une requête timeout 2000ms mais ça ne marche pas !!!!

Je veux prendre des exceptions s'il n'y a pas de réponse dans les 2 secondes
Que dois-je faire?

try 
{ 
     request = (HttpWebRequest)WebRequest.Create("https://ww.google.com"); 
     request.Proxy = proxy; 
     request.Method = "GET"; 
     request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; 
     request.Timeout = 2000; 
     response = (HttpWebResponse)request.GetResponse(); 
     if ((response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect)) 
     { 
       StreamReader sreader = new StreamReader(response.GetResponseStream(), Encoding.Default); 
       gethtml = sreader.ReadToEnd(); 
       sreader.Close(); 
     } 
} 
catch (Exception ex) 
{ 
     throw ex; 
} 
+0

Il semble que la requête soit déclarée en dehors de votre portée d'essai. D'où il est possible que d'autres acteurs modifient le timeout? Peut-être essayer de déclarer la réponse dans la portée de l'essai et voir comment ça se passe. – SAm

+0

Avez-vous envisagé de passer à l'HttpClient Api plus moderne? Vous seriez en mesure de gérer ces cas d'une manière très élégante en utilisant CancellationTokens: https://msdn.microsoft.com/en-us/library/hh139115(v=vs.110).aspx –

+0

@SAm merci pour des conseils. Comme suggéré, j'ai mis la déclaration httpwebrequest dans un essai. mais, le problème reste encore, mais merci –

Répondre

0

Ironie du sort lors des essais avec l'URL invalide https://ww.google.com vous avez accidentellement déclenché une mine. Voir this post pour plus de détails. La documentation MSDN mentionnée dans ce message est here. Notez que WebRequest.Create renvoie un HttpWebRequest. Fondamentalement, il faudra un certain temps car l'URL n'est pas mappée à une adresse IP et ne sera donc pas mise en cache dans la chaîne, ce qui nécessite une recherche DNS complète chaque fois que vous en faites la demande. Il n'y a vraiment rien que vous puissiez faire à ce sujet, sauf si vous utilisez votre propre couche de cache DNS dans le client, mais franchement, c'est plus de problèmes que ça en vaut la peine.