【问题标题】:Performance Issue: .NET HttpClient Response is slow性能问题:.NET HttpClient 响应缓慢
【发布时间】:2018-12-24 20:40:26
【问题描述】:

问题:

我正在使用 .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 个并发呼叫。

请帮我解决这个问题。

【问题讨论】:

  • 您需要阅读并理解 async/await 的基础知识。如果你这样做了,你的问题就会得到解答。
  • 另外,您如何进行并发呼叫?
  • @GabrielLuci 我通过内部 WebApi 方法“GetWebAPidata()”调用,然后启动 HttpClient
  • @IanKemp,我的问题不会得到回答,除非并且直到我们可以将最佳方法应用于这种通用场景,我们需要在更短的时间内发出多个端点请求。我正在整理问题出在哪里。这就是为什么我在这个论坛上问这个问题,有人帮我摆脱。这只是讨论。对不起,如果我错了。
  • 是的,但该方法只发出 一个 请求。您如何同时调用它 50 次?该代码同样重要。

标签: c# rest dotnet-httpclient


【解决方案1】:

使用异步 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);
    }
}

【讨论】:

  • 这减少了时间,现在需要 300 - 400 毫秒才能得到结果。这是正确的时间消耗,因为我通过 ping {IPAddress} ping 服务器的 IP 地址来验证它,它需要 245 毫秒 1 往返。等待这 300 - 400 毫秒的延迟是否可行?另外,“.Result”将如何阻止调用?你能解释一下吗?
  • 一个 ping 显然会更快,因为没有工作正在完成。提到的时间是合理的,但这是一个偏好问题。
【解决方案2】:

HttpClient 的默认 SSL 连接空闲超时为 2 分钟。因此,之后您必须与服务器重新握手。这可能是根本原因。

您可以按照这篇文章(https://www.stevejgordon.co.uk/httpclient-connection-pooling-in-dotnet-core) 来延长超时时间。但是我这边的测试结果,我只能延长到5分钟。之后,连接将被关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2022-08-20
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多