salut j'ai lu cet article vous utilisez mal HttpClient et cela déstabilise votre logiciel l'article suggère ces 2
maintenant un débutant sur c # comme moi le suivrait comme le code affiché sur l'article ici est le code original qui, selon lui, ferait échouer l'application
using System;
using System.Net.Http;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Starting connections");
for(int i = 0; i<10; i++)
{
using(var client = new HttpClient())
{
var result = client.GetAsync("http://aspnetmonsters.com").Result;
Console.WriteLine(result.StatusCode);
}
}
Console.WriteLine("Connections done");
}
}
}
et pour le réparer, il a donné ce code:
using System;
using System.Net.Http;
namespace ConsoleApplication
{
public class Program
{
private static HttpClient Client = new HttpClient();
public static void Main(string[] args)
{
Console.WriteLine("Starting connections");
for(int i = 0; i<10; i++)
{
var result = Client.GetAsync("http://aspnetmonsters.com").Result;
Console.WriteLine(result.StatusCode);
}
Console.WriteLine("Connections done");
Console.ReadLine();
}
}
}
étant maintenant curieux comme tout débutant, j'ai pensé à la boucle for à l'intérieur de l'instruction using, l'effet sera-t-il le même que celui-ci?
je vous remercie
La différence est que dans la boucle supérieure, vous créez 10 objets HttpClient au total, en les utilisant une fois, puis en supprimant chacun, tandis qu'en bas, vous créez un seul HttpClient et vous le réutilisez.
Le point de l'article est qu'il est assez inefficace - et totalement inutile - de créer un nouvel objet HttpClient chaque fois que vous souhaitez effectuer un appel de service Web. Étant donné que HttpClient est non seulement réutilisable, mais thread-safe, la méthode préférée consiste à créer un seul HttpClient et à le réutiliser jusqu'à ce que votre programme ait terminé les connexions http.
Il semble que vous demandiez pourquoi pas:
using System;
using System.Net.Http;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Starting connections");
using (var client = new HttpClient())
{
for(int i = 0; i<10; i++)
{
var result = Client.GetAsync("http://aspnetmonsters.com").Result;
Console.WriteLine(result.StatusCode);
}
}
Console.WriteLine("Connections done");
Console.ReadLine();
}
}
}
Dans ce cas précis, il n'y a aucune différence. L'important est que le HttpClient soit réutilisé jusqu'à ce que chaque requête soit effectuée. Dans la plupart des scénarios réalistes, avoir une propriété statique pour un HttpClient est le plus logique pour atteindre cet objectif.
La raison pour laquelle ils disent "ne pas utiliser en utilisant" est que using
implique que votre HttpClient est une variable locale dans une méthode, et dans la plupart des cas, ce n'est pas ce que vous voulez. Dans ce cas spécifique, chaque requête http du programme se produit dans une méthode qui n'est appelée qu'une seule fois, donc une variable qui est locale à cette méthode est très bien - vous vous retrouvez avec un HttpClient qui est réutilisé jusqu'à ce que toutes les requêtes se soient produites, puis est disposé.
Ajout d'une réponse pour référencer les documents de Microsoft:
HttpClient est destiné à être instancié une fois et réutilisé tout au long de la vie d'une application. En particulier dans les applications serveur, la création d'une nouvelle instance HttpClient pour chaque demande épuisera le nombre de sockets disponibles sous de fortes charges. Cela entraînera des erreurs SocketException .