c# - c# Httpclient单例在多个客户端/用户上具有相同的身份验证标头
问题描述
我有一个调用 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;
}
解决方案
官方文档建议您使用 HttpClientFactory 来实现弹性 HTTP 请求。它使 HttpClient 实例的管理更容易。
推荐阅读
- python - 为什么 np.corrcoef() 标准化为统一?
- javascript - 如何将栅格图层导入到传单 web 地图中?
- spring-boot - spring boot dynamodb 吞吐量配置
- javascript - 如何对被推入最初为空的数组的索引项求和?
- java - 有没有办法使用 HQL 获取小于或等于当前时间的最新条目?
- rx-swift - RxSwift的调度器切换后奇怪
- c++ - 如何在 QWebEngineView 中保存动态生成的网页?
- c - 这行代码翻译成什么?为什么要除以 16?
- python - 获取轴上的刻度
- swift - 关于在 Swift 中更改参数值的问题