Comment puis-je spécifier une connexion uniquement délai d'attente lors de l'exécution de requêtes web?
Je suis actuellement à l'aide de code qui effectue des requêtes HTTP à l'aide de la classe HttpClient. Bien que vous pouvez spécifier un délai d'attente de la demande, la valeur s'applique à l'intégralité de la demande (qui comprend la résolution du nom d'hôte, l'établissement d'une connexion, envoi de la demande et la réception de la réponse).
J'ai besoin d'un moyen de faire des demandes échouer rapidement si elles ne peuvent pas résoudre le nom ou établir une connexion, mais j'ai aussi parfois besoin de recevoir de grandes quantités de données, qui ne peuvent donc pas seulement de réduire le délai d'attente.
Est-il un moyen pour y parvenir avec un construit en (BCL) de la classe ou un autre client HTTP pile?
J'ai regardé brièvement à RestSharp et ServiceStack, mais ni semble fournir un délai d'attente juste pour la connexion de la partie (mais corrigez-moi si je me trompe).
Le Délai d'attente sur HttpWebRequest "s'applique à l'ensemble de la demande et de la réponse" (à partir de la page MSDN).
Est en train de changer la valeur de Délai d'expiration après la connexion a été établie une option?
Pourquoi ne pas vous venez d'effectuer (asynchrone) de la résolution DNS à l'avance, qui est le principal bugaboo? Je ne voudrais pas essayer d'établir la connectivité sur le port séparément ainsi-les régulièrement délai d'attente de prendre soin de cela, parce qu'un bon pare-feu est indiscernable d'un serveur lent-mais la résolution DNS peut seulement être pris en compte.
"si elles ne peuvent pas résoudre le nom ou établir une connexion" Il y a deux parties A) Le DNS résoudre et B) le Socket ouvert à ce port. Pas de DNS résoudre est généralement parce que 1) UN serveur DNS ou c'est d'autres voisins ne peut pas résoudre le nom ou 2) Le serveur DNS. La deuxième partie est une volonté d'envoyer un socket ouvert demande, c'est ce qu'un scanner de port, il de voir si le socket (adresse/port paire) est de répondre. Il le fait simplement en démarrant une session via un Socket.Open(). Le client répond ou ne l'est pas et le temps qu'il faut si vous avez le DNS résoudre est minime.
OriginalL'auteur Morten Mertner | 2014-11-16
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un
Timer
pour annuler la demande si la connexion de prendre trop de temps. Ajouter un événement lorsque le temps est écoulé. Vous pouvez utiliser quelque chose comme ceci:Fois ici sont juste pour l'exemple, vous devez vous adapter à vos besoins.
OriginalL'auteur Ludovic Feltz
.NET HttpWebRequest expose 2 propriétés pour spécifier un Délai d'attente pour une connexion avec un Serveur HTTP distant:
La
Timeout
de propriété est le plus proche de ce que vous êtes après, mais il ne suggère que, indépendamment de la valeur de Délai d'expiration de la résolution DNS peut prendre jusqu'à 15 secondes:Une façon de prempt une baisse du délai de 15 ans pour les recherches DNS est à recherche le nom d'hôte vous-même, mais de nombreuses solutions nécessite de P/Invoke pour spécifier faible niveau des paramètres.
Précisant les délais dans ServiceStack les Clients HTTP
Le sous-jacent
HttpWebRequest
Délai et ReadWriteTimeout propriétés peuvent également être spécifiées dans ServiceStack de haut niveau les Clients HTTP, c'est à dire dans C# Service Clients avec:Ou à l'aide de ServiceStack de HTTP Utils avec:
Je suggère de le seul Délai d'expiration des options disponibles,
Timeout
est le plus proche de ce que vous cherchez. En outre, tous les clients de la construite sur .NET sous-jacent deHttpWebRequest
est également à seulement allons avoir la même API, au mieux, que la seule solution pour un contrôle plus précis est de P/Invoke dans Win32 API système.La droite. Je suis déjà à l'aide de Délai d'attente, mais je ne suis pas heureux avec elle, donc toujours à la recherche d'une alternative .NET-library. Je pourrais finir par écrire un moi-même (à l'aide de l'Api du système), mais c'est plus de travail que je peux le serrer dans le cycle actuel.
Avez-vous regardé l'aide de HttpWebRequest de manière asynchrone et la mise en œuvre de votre propre délai d'attente de la logique?
OriginalL'auteur mythz
Je crois RestSharp n'ont timeout propriétés dans RestClient.
HttpWebRequest a deux différents délais d'attente, un Délai d'attente est pour toute la connexion du cycle de vie et ReadWriteTimeout pour les Flux de chasse délai d'attente. Il est en défaut de conception qui HttpClient ne pas spécifier à la fois, cependant HttpClient est asynchrone, donc vous pouvez et vous devez mettre en place votre propre Jeton d'Annulation Source d'approvisionnement en annulation (timing) de lecture/écriture de flux de fonctionnement.
Il n'est pas tellement un problème qui est de ne pas mettre en œuvre à la fois (voir 2ème réponse à cette DONC, la question: stackoverflow.com/questions/1500955/...), mais plutôt qu'elle n'a un ConnectionTimeout. Je vais probablement aller pour l'utilisation de minuteries et annule la requête manuellement (par Ludovic de la suggestion), mais il sent.
OriginalL'auteur cubski
Vous droit, vous ne pouvez pas régler ce délai spécifique.
Je n'ai pas assez d'informations sur la façon dont les bibliothèques ont été construites, mais dans le but de qu'ils sont censés, je crois qu'ils fit. Quelqu'un veut faire une demande et de définir un délai d'attente pour tout.
Je vous suggère de prendre une approche différente.
Vous essayez de faire deux choses différentes ici que
HttpRequest
faire à la fois:Vous pouvez essayer de faire la séparation en deux étapes.
Ping
classe (check this out) pour essayer d'obtenir à votre hôte et de définir un délai d'attente;HttpRequest
SI cela fonctionne pour vos besoins (de l'expiration du délai,Ce processus ne devrait pas ralentir tout, puisqu'une partie de la résolution de noms/itinéraires pourrait être réalisé lors de la première étape. Ce ne serait pas totalement jetables.
Il y a un inconvénient de cette solution: votre hôte distant doit accepter les pings.
Espérons que cette aide.
OriginalL'auteur rodrigogq
J'ai utilisé cette méthode pour vérifier si la connexion peut être établie. Toutefois, cela ne veut pas garantie que la connexion peut être établie par l'appel suivant dans
HttpWebRequest
.OriginalL'auteur tcb
si des délais d'expiration n'est pas adaptée à votre besoin - ne les utilisez pas. vous pouvez utiliser un gestionnaire qui l'attend pour la fin de l'opération. lorsque vous obtenez une réponse, arrêter le gestionnaire et continuer. de cette façon, vous obtiendrez court laps de temps les demandes en cas d'échec, et depuis longtemps, les demandes pour de grandes quantités de données.
quelque chose comme ceci peut-être:
OriginalL'auteur ymz
Qu'en demandant seulement l'en-tête d'abord, puis l'habitude ressource si elle est réussie,
HEAD
demandes. Le problème original d'avoir le timeout de la connexion ne serait pas disparaître -- ils ne seraient pas "fail fast".Je n'ai pas vu que l'OP a été sur toutes les requêtes head. Pour résoudre les OP de "j'ai besoin d'un moyen de faire des demandes échouer rapidement si elles ne peuvent pas résoudre le nom ou établir une connexion, mais j'ai aussi parfois besoin de recevoir de grandes quantités de données, qui ne peuvent donc pas seulement de réduire le délai d'attente". Tête que de vous laisser savoir si vous avez une erreur 404, 500 ou quelque chose, vous ne sont pas en mesure de programme de autour de.
OriginalL'auteur Andy Powell