c # Httpclient singleton с одинаковым заголовком аутентификации на нескольких клиент / пользователь - PullRequest
1 голос
/ 29 июня 2019

У меня есть функция Azure, которая вызывает API, и я сделал свой HttpClient в качестве одиночного элемента при запуске Dependency Injection, чтобы я мог вызвать его у своего подрядчика. Мой код ниже вызывает 2 API с тем же заголовком аутентификации.

public class MyClass : IMyClass
{
        private readonly HttpClient _httpClient;
        public MyClass(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        public void test(string OAuthToken)
        {
            _httpClient.DefaultRequestHeaders.Accept.Clear();
            _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", OAuthToken);

            // 1st API
            string firstApi = $"https://GetSometthingFirst.com/processes?api-version=5.0";
            var GetFirst = _httpClient.GetAsync(firstApi).Result;

             // add delay 5 secs
             Thread.Sleep(5000);


            // 2nd API
            string secondApi = $"https://GetSometthingSecond.com/processes?api-version=5.0";
            var content = new StringContent(GetFirst.ToString(), Encoding.UTF8, "application/json");

            var result = _httpClient.PostAsync(secondApi, content).Result;
        }

}

В приведенном выше коде у меня есть два вызова API, которые используют один и тот же DefaultRequestHeader. Поскольку это одноэлементная функция, функция может вызываться несколькими пользователями с различным OAthToken в качестве параметра и использовать один и тот же экземпляр HttpClient. Должен ли я обновить заголовок по умолчанию, как этот, чтобы не затронул другой поток?

public void test(string OAuthToken)
        {
            _httpClient.DefaultRequestHeaders.Accept.Clear();
            _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", OAuthToken);

            // 1st API
            string firstApi = $"https://GetSometthingFirst.com/processes?api-version=5.0";
            var GetFirst = _httpClient.GetAsync(firstApi).Result;

            _httpClient.DefaultRequestHeaders.Accept.Clear();
            _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", OAuthToken);

             // add delay 5 secs
             Thread.Sleep(5000)

            // 2nd API
            string secondApi = $"https://GetSometthingSecond.com/processes?api-version=5.0";
            var content = new StringContent(GetFirst.ToString(), Encoding.UTF8, "application/json");

            var result = _httpClient.PostAsync(secondApi, content).Result;
        }

1 Ответ

0 голосов
/ 02 июля 2019

Официальная документация предлагает вам использовать HttpClientFactory для реализации устойчивых HTTP-запросов . Это облегчает управление экземплярами HttpClient.

...