【问题标题】:c# Httpclient singleton with same authentication header on multiple client/userc# Httpclient单例在多个客户端/用户上具有相同的身份验证标头
【发布时间】:2019-06-29 07:26:04
【问题描述】:

我有一个调用 API 的天蓝色函数,并且我在启动依赖注入中将我的 HttpClient 作为单例,以便我可以在我的承包商上调用它。我下面的代码调用了具有相同身份验证标头的 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;
        }

}

在上面的代码中,我有两个使用相同 DefaultRequestHeader 的 API 调用。由于它是一个单例,因此该函数可以由多个用户以不同的 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;
        }

【问题讨论】:

  • OAuthToken 对所有请求都相同还是会发生变化?
  • 是的,它会因每个用户或客户而改变。

标签: c# api singleton httpclient azure-functions


【解决方案1】:

官方文档建议你 use HttpClientFactory to implement resilient HTTP requests 。它使 HttpClient 实例的管理更加容易。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多