繁体   English   中英

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

[英]Why is first HttpClient.GetAsync call extremely slow in my C# asp form app?

第一次调用需要 10-15 秒,所有连续调用只需要不到 1 秒。 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);
[...]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM