[英]Performance Issue: .NET HttpClient Response is slow
問題:
我正在使用 .NET 類HttpClient
向端點 URL 發出請求。
我的代碼:
using (HttpClient apiClient1 = new HttpClient())
{
apiClient.GetAsync(apiUrl).Result;
}
問題確定:
如果我使用using
塊,我將打開多個連接,導致socketExceptions
。
將我上面的代碼更改為:
public class RequestController: ApiController
{
private static HttpClient apiClient = new HttpClient();
[HttpPost]
public dynamic GetWebApiData([FromBody] ParamData params)
{
var resultContent = apiClient.GetAsync(apiUrl).Result.Content;
return Newtonsoft.Json.JsonConvert.DeserializeObject<object>(resultContent.ReadAsStringAsync().Result);
}
}
將HttpClient
設為static
后,上述代碼的結果如下:
僅建立一個連接。
對於每個請求,我希望響應時間減少 200 毫秒。
我需要的:
我想以高速響應向端點發出至少 50 個並發呼叫。
請幫助我解決這個問題。
使用異步 API 並停止調用.Result
阻塞調用。
public class RequestController: ApiController {
private static HttpClient apiClient = new HttpClient();
[HttpPost]
public async Task<IHttpActionResult> GetWebApiData([FromBody] ParamData data) {
var response = await apiClient.GetAsync(apiUrl);
var resultContent = response.Content;
var model = await resultContent.ReadAsAsync<dynamic>();
return Ok(model);
}
}
HttpClient 的默認 SSL 連接空閑超時時間為 2 分鍾。 所以,之后你必須重新與服務器握手。 這可能是根本原因。
您可以按照這篇文章( https://www.stevejgordon.co.uk/httpclient-connection-pooling-in-dotnet-core )來延長超時時間。 但是我這邊的測試結果,我只能延長到5分鍾。 之后,連接將被關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.