web-dev-qa-db-fra.com

HttpClient dans l'utilisation de l'instruction

salut j'ai lu cet article vous utilisez mal HttpClient et cela déstabilise votre logiciel l'article suggère ces 2

  1. Rendez votre HttpClient statique
  2. Ne jetez pas ou n'enveloppez pas votre HttpClient dans une utilisation à moins que vous ne recherchiez explicitement un comportement particulier (tel que provoquer l'échec de vos services)

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

19
angelogogo

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.

Modifier

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é.

20
PMV

Ajout d'une réponse pour référencer les documents de Microsoft:

https://docs.Microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

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 .

11
Jasen