Подтвердить что ты не робот

HttpClient в использовании оператора

Привет, я прочитал эту статью Вы неправильно используете HttpClient и дестабилизируете свое программное обеспечение, статья предлагает эти 2

  • Сделайте свой HttpClient статическим
  • Не удаляйте и не обертывайте свой HttpClient при использовании, если вы явно не ищете какое-либо конкретное поведение (например, чтобы ваши службы терпят неудачу)

теперь новичок на С#, как я, просто последует за ним, как в коде, опубликованном в этой статье, здесь находится исходный код, который, по его словам, приведет к сбою приложения.

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");
        }
    }
}

и исправить это он дал этот код:

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();
        }
    }
}

теперь любопытно, как любой новичок, которого я думал о цикле for внутри оператора using, будет ли эффект таким же, как последний?

Благодарю вас

4b9b3361

Ответ 1

Разница в том, что в верхнем цикле вы создаете 10 общих объектов HttpClient, используя каждый раз, а затем удаляя их, а внизу вы создаете только один HttpClient и повторно используете его.

Цель статьи заключается в том, что она совершенно неэффективна и совершенно ненужна - создавать новый объект HttpClient каждый раз, когда вы хотите сделать вызов веб-службы. Поскольку HttpClient не только многоразовый, но и потокобезопасный, предпочтительным методом является создание одного HttpClient и его повторное использование до тех пор, пока ваша программа не будет выполнена с помощью http-соединений.

Изменить

Похоже, вы спрашивали, почему не это:

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();
        }
    }
}

В этом конкретном случае нет никакой разницы. Важно то, что HttpClient используется повторно до тех пор, пока не будет выполнен каждый запрос. В большинстве реалистичных сценариев наличие статического свойства для HttpClient имеет наибольшее значение для достижения этой цели.

Причина, по которой они говорят "не использовать использование", заключается в том, что using подразумевает, что ваш HttpClient является локальной переменной внутри метода, и в большинстве случаев это не то, что вы хотите. В этом конкретном случае каждый HTTP-запрос из программы происходит в одном методе, который вызывается только один раз, поэтому переменная, которая является локальной для этого метода, в порядке: вы получаете один HttpClient, который используется повторно до тех пор, пока все запросы не произойдут, а затем расположены.

Ответ 2

Добавление ответа в справочные документы Microsoft:

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

HttpClient предназначен для создания экземпляра один раз и повторного использования на протяжении всего срока службы приложения. Особенно в серверных приложениях создание нового экземпляра HttpClient для каждого запроса исчерпает количество сокетов, доступных при тяжелых нагрузках. Это приведет к ошибкам SocketException.