2017-03-21 4 views
3

J'ai créé une application console qui effectue essentiellement une grande quantité de requêtes vers mon serveur. 10-15000 demandes par utilisateur.Exécution simultanée de requêtes http à l'aide de httpclient dans .NET C#

J'ai écrit ce code qui utilise la bibliothèque client HTTP .NET:

public async Task<string> DoRequest(string token) 
{ 

var request = new HttpRequestMessage(HttpMethod.Post, "mysite.com"); 
string requestXML = "my xml request goes her..."; 
request.Content = new StringContent(requestXML, Encoding.UTF8, "text/xml"); 
var response = await httpClient.SendAsync(request); 
return await response.Content.ReadAsStringAsync(); 
} 

Alors maintenant, je suis en train d'effectuer autant que les requêtes HTTP que je peux par 1 seconde ... Je don sais pas ce qui est la limite supérieure de cette façon que je l'ai utilisé en parallèle pour la boucle pour accélérer ceci:

Parallel.For(0,list.Count(),items=>{ 
DoRequest(item.Token); 
}); 

Mais je ne suis pas très heureux avec la vitesse du code et la façon dont les demandes sont en cours ..

Y a-t-il un moyen de faire avancer les choses? Peut-être jusqu'à 10-100 demandes par seconde? Ou quelle est la limite maximale?

Quelqu'un peut-il m'aider?

P.S. les gars je n'ai créé qu'une seule instance de la classe httpclient parce que j'ai lu que c'est une bonne habitude de n'en faire qu'une puisque chaque fois qu'un nouvel objet de cette classe est créé, la connexion se ferme, ce qui n'est pas ce que nous voulons.

+3

Votre test peut ne pas être particulièrement utile. Par exemple, 'HttpClient' est limité au nombre de connexions au même serveur à un moment donné (bien que vous puissiez le changer avec' ServicePointManager.DefaultConnectionLimit') – DavidG

+0

@DavidG pouvez-vous me montrer exactement comment faire cela et où? Dans cette même méthode ou? – User987

+1

ServicePointManager.DefaultConnectionLimit est une propriété @ User987 qu'il suffit de définir. – Botonomous

Répondre

2

Y at-il un moyen d'accélérer les choses? Peut-être jusqu'à 10-100 demandes par seconde?

C'est une question sans réponse.

Ou quelle est la limite maximale?

Comme David l'a noté, vous devez définir ServicePointManager.DefaultConnectionLimit. Cela devrait suffire comme la première ligne de votre méthode Main:

ServicePointManager.DefaultConnectionLimit = int.MaxValue; 

Je l'ai utilisé en parallèle pour la boucle pour accélérer ce

C'est l'outil incorrect pour ce travail. Vous voulez de la concurrence, mais pas du parallélisme. concurrency asynchrone est exprimée à l'aide Task.WhenAll:

var tasks = list.Select(item => DoRequest(item.Token)); 
await Task.WhenAll(tasks); 

Je crée une seule instance de classe httpclient parce que je lis que c'est une bonne pratique de faire une seule puisque chaque fois qu'un nouvel objet de cette classe est faite la connexion obtient fermé, ce qui n'est pas ce que nous voulons non?

C'est correct.

+0

Stephen, et comment pourrais-je charger les résultats de Task.WhenAll (tâches)? A l'intérieur de chaque tâche il y a une réponse XML. Comment les chargerais-je dans XMLDocument? – User987

+0

@ User987 Acheminez les tâches de continuation vers eux. Avoir la suite lire le XML et faire ce que vous voulez avec cela après cela. – Botonomous

+0

@ User987: 'var results = await Tâche.WhenAll (tâches);' vous obtiendra une variable 'results' qui est un tableau de réponses XML. –