为什么我的C#asp表单应用程序中第一个HttpClient.GetAsync调用速度极慢?

时间:2017-07-18 19:06:33

标签: c# asp.net httpclient

第一次通话需要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);
[...]

1 个答案:

答案 0 :(得分:0)

不知道你解决了没有。但是我在我们公司内部也遇到了类似的问题。结果证明是我们 DNS 中的 IPv6 条目错误导致了延迟。