Очень медленный вызов HttpClient SendAsyn c - PullRequest
1 голос
/ 08 июля 2020

Прочитав другие ответы, я не могу понять, почему SendAsyn c работает так медленно.

Вызов той же конечной точки из Postman, я получил ответ через 160 мс.

Вызов из кода ниже, занимает 10 секунд. Я использую настольное приложение c# для звонка.

public static async Task<string> GetToken()
{

    var url = "....";

    var dict = new Dictionary<string, string>();
    dict.Add("username", "foo");
    dict.Add("password", "bar");

    using (var client = new HttpClient(
        new HttpClientHandler
        {
            Proxy = null,
            UseProxy = false
        }))
    {
        //bypass SSL
        ServicePointManager.ServerCertificateValidationCallback = new
            RemoteCertificateValidationCallback
            (
                delegate { return true; }
            );
        var req = new HttpRequestMessage(HttpMethod.Post, url) { Content = new FormUrlEncodedContent(dict) };
        var res = await client.SendAsync(req); //10 seconds here!
        if (res.StatusCode != HttpStatusCode.OK)
            return string.Empty;

        var token = await JsonConvert.DeserializeObject<TokenResponse>(res.Content.ReadAsStringAsync());
        return token.access_token;
    }
}

1 Ответ

1 голос
/ 08 июля 2020

Ваш код запутан и игнорирует IDisposable, и это: HttpClient предназначен для создания экземпляра один раз для каждого приложения, а не для каждого использования.

Сделайте метод многократного использования для другого -типы запросов

private static readonly HttpClient client = new HttpClient();

private async Task<T> PostDataAsync<T>(string url, Dictionary<string, string> formData)
{
    using (HttpContent content = new FormUrlEncodedContent(formData))
    using (HttpResponseMessage response = await client.PostAsync(url, content).ConfigureAwait(false))
    {
        response.EnsureSuccessStatusCode(); // throws if 404, 500, etc.
        string responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
        return JsonConvert.DeserializeObject<T>(responseText);
    }
}

Использование

public static async Task<string> GetToken()
{
    var url = "....";

    var dict = new Dictionary<string, string>();
    dict.Add("username", "foo");
    dict.Add("password", "bar");

    try
    {
        TokenResponse token = await PostDataAsync<TokenResponse>(url, dict);
        return token.access_token;
    }
    catch (HttpRequestException ex)
    {
        // handle Exception here
        return string.Empty;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...