Утилита HttpClient. Net Веб-формы - PullRequest
0 голосов
/ 24 марта 2020

Я относительно новичок в использовании HttpClient и API, но я провел некоторые поиски, и кажется, что общее мнение, даже из документов Microsoft, состоит в том, что HttpClient должен быть создан один раз. У меня есть несколько мест, где мне нужно вызывать конечную точку API в моем проекте, поэтому я создал служебный класс HttpClient, который можно вызывать.

    public static class HttpClientManager
    {
        private static HttpClient _httpClient;
        private static HttpClientHandler _handler;
        private static readonly string _apiBaseUrl = ConfigurationManager.AppSettings["ApiUrl"];

        static HttpClientManager()
        {
            if (_handler == null) _handler = new HttpClientHandler
            {
                UseDefaultCredentials = true,
                PreAuthenticate = true,
                AllowAutoRedirect = true,
                ClientCertificateOptions = ClientCertificateOption.Automatic
            };

            if (_httpClient == null) _httpClient = new HttpClient(_handler, false);
        }

        public static HttpClient GetHttpClient()
        {
            if(_httpClient.BaseAddress == null)
            {
                _httpClient.BaseAddress = new Uri(_apiBaseUrl);
            }
            _httpClient.DefaultRequestHeaders.Accept.Clear();
            _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            return _httpClient;
        }
    }

Общая идея заключается в том, что конструктор stati c инициализирует http-клиента, а затем у меня есть метод getHttpClient c stati, который установит адрес и заголовки и вернет клиенту другие классы. в моем проекте можно сделать вызов, например, HttpClientManager.GetHttpClient (). GetAsyn c (.....) ....

Теоретически это должно гарантировать, что клиент будет инициализирован один раз на сначала вызовите конструктор stati c и используйте его повторно в течение всего жизненного цикла приложения. Это правильный способ сделать что-то подобное или есть лучший дизайн?

Любой совет будет признателен, спасибо!

...