我已經閱讀了很多關於如何儘可能重用HttpClient實例的問題,甚至可能在整個應用程序生命週期中。爲了完整起見,這裏有一些資源是我立足於我的發言:當每個請求需要新的授權標頭時,在Web應用程序中重用HttpClient
- Do HttpClient and HttpClientHandler have to be disposed?
- You're Using HttpClient Wrong and it is Destabilizing Your Software
- What is the overhead of creating a new HttpClient per call in a WebAPI client?
我有幾個關於這個問題:
- 如何創建HttpClient的應用程序範圍實例在ASP.NET MVC中被所有請求共享?假設圖片中沒有IoC容器,所以我不能只將它與Singleton作用域綁定在container-name-here並稱之爲一天。我該怎麼做「手動?」
- 此外,我與交互的Web服務需要在一個新授權令牌各要求,所以即使想出了一個辦法做到#1以上,如何在每提供一個新的授權頭請求,以便它不會與潛在的多個併發請求(來自不同用戶以及不同的請求)相沖突?我的理解是,當涉及到GetAsync和其他方法時,HttpClient本身是相當線程安全的,但設置DefaultAuthorizationHeaders對我來說似乎不是線程安全的,是嗎?
- 如何保持單元可測試?
這是我正在進行的代碼看起來像到目前爲止(在一定程度上簡化形式爲簡潔起見這裏):
public class MyHttpClientWrapper : IDisposable
{
private readonly HttpClient _httpClient;
private readonly TokenManager _tokenManager;
public HttpServiceClient(HttpClient httpClient, TokenManager tokenManager)
{
_httpClient = httpClient;
_tokenManager = tokenManager;
_httpClient.BaseAddress = new Uri("https://someapp/api/");
_httpClient.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
}
public string GetDataByQuery(string query)
{
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"amx", _tokenManager.GetNewAuthorizationCode());
var response = _httpClient.GetAsync(query).Result;
return response.Content.ReadAsStringAsync().Result;
}
public void Dispose()
{
HttpClient?.Dispose();
}
}
邊注:我使用依賴注入這裏,但不一定是IoC容器(出於與此討論無關的原因)。
假設您的應用程序是異步的,如果多個線程輸入GetDataByQuery並且它們都會更改DefaultRequestHeaders,會發生什麼情況。授權? 我相信你可以創建一個HttpRequestMessage對象,在其上設置授權頭,最後調用_httpClient.SendAsync(requestMessage) – raRaRa
是的,好點。我曾經在一點上實際上實現了同樣的目標,並開始按照你在那裏描述的內容來做。 – Jiveman