簡體   English   中英

性能問題:.NET HttpClient 響應很慢

[英]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后,上述代碼的結果如下:

  1. 僅建立一個連接。

  2. 對於每個請求,我希望響應時間減少 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM