【问题标题】:Initial HttpClient Call Taking a Long Time初始 HttpClient 调用需要很长时间
【发布时间】:2016-06-15 02:49:07
【问题描述】:

我正在使用 HttpClient 从 C# 可移植类库中通过 https 调用远程 Web 服务。我对 Web 服务的初次调用大约需要 45 秒。随后的调用只需要一两秒钟。从 JavaScript 调用 Web 服务时,我在初次调用时没有类似问题。有没有办法优化 HttpClient 以使初始调用更快?

【问题讨论】:

    标签: c# httpclient portable-class-library


    【解决方案1】:

    听起来延迟可能是服务器端。如果您正在调用 C# Web 服务,则 C# Web 服务需要在第一次调用时进行 JIT 编译。第一次调用可能比后续调用花费更长的时间。

    区分是服务器端还是客户端问题。使用另一个客户端(浏览器,或启动客户端应用程序的另一个实例)首先调用相同的 Web 服务。然后使用您的应用程序与 HTTPClient 进行“初始”调用以查看 45 秒延迟是否消失。

    【讨论】:

    • 使用其他客户端(来自 Chrome 的 JavaScript)不包括延迟。我还应该补充一点,这是通过 https 调用的。
    • 1) 在 Chrome 客户端的 JavaScript 调用 Web 服务后,您仍然遇到 HttpClient 的延迟? 2) 您的 JavaScript 客户端调用与 HttpClient 相同的 URL 并访问服务代码的相同部分? 3)您确认 HttpClient 调用占用了 45 秒,而不是代码的其他部分?如果以上都是肯定的,你能告诉我们一些代码吗?
    • 我相信您所有问题的答案都是“是”。使用 Fiddler 监控通话时,我发现“Tunnel to”通话需要很长时间。大约 45 秒后,HTTPS 调用出现并成功。我拨打电话的代码是:
    • var accessToken = "..."; var authHeader = "..."; var httpClient = new HttpClient { BaseAddress = new Uri("https://music.xboxlive.com/1/") }; httpClient.DefaultRequestHeaders.Add("Authorization", authHeader); var response =httpClient.GetAsync($"content/music/collection/playlists/browse?{accessToken}&maxItems=25").Result;
    • 我的httprequest使用TcpClient 20s
    【解决方案2】:

    您确定是 HttpClient 调用需要时间吗?它可能是别的东西。例如:您是否将HttpMessageHandler 添加到您的HttpClient

    我之前遇到过类似的问题,我们发现根本原因是我们正在添加客户端证书来验证请求。客户端证书正在从 LocalMachine 加载。现在,如果有许多并行请求并且您每次都从 LocalMachine 加载证书。在为单个请求加载证书之前,您的所有请求都将被阻止。在您的情况下,它可能不是证书,而是其他东西。但最好确认是实际调用需要时间。

    【讨论】:

    • 如何确认?
    • 记录您的服务调用所花费的实际时间与您的代码的其他部分(如创建 HttpClient 对象等)。这样您将能够找出瓶颈,然后您就可以着手处理它,
    • 调用本身需要很长时间。看起来可能是 SSL 连接的协商?关于如何准确诊断的任何想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2018-12-27
    • 2022-06-15
    • 2017-09-03
    • 2019-04-30
    相关资源
    最近更新 更多