【发布时间】:2017-07-18 19:06:32
【问题描述】:
第一个呼叫需要 10-15 秒,所有后续呼叫都需要不到一秒。 stackoverflow 上有多个类似的问题,但没有一个答案能缩短时间。
作为 asp webMethod 的一部分,我使用 HttpClient 调用外部 API (facebook)。我已确保 HttpClient 仅在应用程序启动时设置和初始化一次,而不是为对我的 webMethod 的每个请求创建一个新对象。我确保禁用代理使用(在对象级别和作为我的 web.config 的一部分)。在第一次调用时挂起 10 秒的特定线路是 GetAsync。我调用多个端点,一旦第一个端点通过,它们都非常快,所以我怀疑这与任何类型的缓存有关。
这是我初始化 httpClient 的方式:
private readonly HttpClient _httpClient;
public FacebookClient()
{
_httpClient = new HttpClient(new HttpClientHandler
{
UseProxy = false,
Proxy = null,
});
_httpClient.BaseAddress = new Uri("https://graph.facebook.com/v2.9/");
_httpClient.Timeout = TimeSpan.FromMinutes(1);
_httpClient.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
来电:
public async Task<T> GetAsync<T>(string accessToken, string appsecret_proof, string endpoint, string args = null)
{
HttpResponseMessage response;
if (String.IsNullOrEmpty(appsecret_proof))
{
// First call hangs for 10 seconds.
response = await _httpClient.GetAsync($"{endpoint}?access_token={accessToken}&{args}").ConfigureAwait(false);
}
[...]
调用自:
public async Task<TokenDebug> GetTokenDebugInfoAsync(string inputToken, string accessToken)
{
var result = await _facebookClient.GetAsync<dynamic>(
accessToken,
String.Empty,
"debug_token",
$"input_token={inputToken}&access_token={accessToken}").ConfigureAwait(false);
[...]
【问题讨论】:
-
可能是某种安全软件?我对 TrendMicro 和 WCF 也有同样的问题。
-
您的代码对我来说看起来不错。您是否使用过 Fiddler 之类的工具来查看网络堆栈中发生的情况?我同意 Christian 的观点,这听起来像是在你的应用之外。
-
是的,它确实看起来像是外部的东西。我会尝试 fiddler 和 wireshark 看看发生了什么。
-
您是否尝试过从普通浏览器发出调用?
-
是的。那里没有问题。
标签: c# asp.net httpclient