【发布时间】:2016-06-15 02:49:07
【问题描述】:
我正在使用 HttpClient 从 C# 可移植类库中通过 https 调用远程 Web 服务。我对 Web 服务的初次调用大约需要 45 秒。随后的调用只需要一两秒钟。从 JavaScript 调用 Web 服务时,我在初次调用时没有类似问题。有没有办法优化 HttpClient 以使初始调用更快?
【问题讨论】:
标签: c# httpclient portable-class-library
我正在使用 HttpClient 从 C# 可移植类库中通过 https 调用远程 Web 服务。我对 Web 服务的初次调用大约需要 45 秒。随后的调用只需要一两秒钟。从 JavaScript 调用 Web 服务时,我在初次调用时没有类似问题。有没有办法优化 HttpClient 以使初始调用更快?
【问题讨论】:
标签: c# httpclient portable-class-library
听起来延迟可能是服务器端。如果您正在调用 C# Web 服务,则 C# Web 服务需要在第一次调用时进行 JIT 编译。第一次调用可能比后续调用花费更长的时间。
区分是服务器端还是客户端问题。使用另一个客户端(浏览器,或启动客户端应用程序的另一个实例)首先调用相同的 Web 服务。然后使用您的应用程序与 HTTPClient 进行“初始”调用以查看 45 秒延迟是否消失。
【讨论】:
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;
您确定是 HttpClient 调用需要时间吗?它可能是别的东西。例如:您是否将HttpMessageHandler 添加到您的HttpClient?
我之前遇到过类似的问题,我们发现根本原因是我们正在添加客户端证书来验证请求。客户端证书正在从 LocalMachine 加载。现在,如果有许多并行请求并且您每次都从 LocalMachine 加载证书。在为单个请求加载证书之前,您的所有请求都将被阻止。在您的情况下,它可能不是证书,而是其他东西。但最好确认是实际调用需要时间。
【讨论】: