Огромная непоследовательная задержка при доступе к данным JSON с веб-адреса - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь получить JSON данных с веб-сайтов (например, themoviedb.org). Я могу успешно получить данные, но иногда, когда я это делаю, возникает колоссальная задержка, которая может длиться более минуты, или я получаю сообщение об ошибке подключения (тайм-аут сервера?). Когда это происходит, проблема сохраняется в течение следующих нескольких часов, но я могу попробовать позже тем же вечером, и тот же код работает почти мгновенно!

РЕДАКТИРОВАТЬ: Я также должен упомянуть, что когда первая задержка, наконец, тогда все остальные запросы выполняются мгновенно - это только первый запрос, который вызывает большие задержки. Когда я перезапускаю приложение, задержка повторяется снова. тот же запрос в моем браузере для мгновенных результатов JSON. Что-то в моем приложении или в моей настройке Visual Studio 2015 позволяет этой случайной задержке постоянно появляться.

Вот код для приложения:

    public static HttpClient Client = new HttpClient();

    public MainWindow()
    {
        InitializeComponent();

        ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    }

    private async void button_Click(object sender, RoutedEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.Wait;
        string url = "https://api.themoviedb.org/3/search/person?api_key=" + theMovieDbKey + "&query=%22Hanks%22";
        HttpResponseMessage response = await Client.GetAsync(url);
        string content = await response.Content.ReadAsStringAsync();
        Mouse.OverrideCursor = null;
        MessageBox.Show(content);
    }

До сих пор я пробовал без успешно:

  • Переход с WebClient на HttpClient
  • Изменение протоколов безопасности.
  • Отключение прокси.
  • Отключение диагностики c инструментов.

Второй элемент на этом экране Fiddler показывает некоторую информацию:

Fiddler results

И вот заголовки:

Fiddler headers

Любая помощь будет принята с благодарностью, поскольку я просто не знаю, что вызывает это.

РЕДАКТИРОВАТЬ: заголовки из успешного запроса браузера :

enter image description here

1 Ответ

0 голосов
/ 02 июня 2020

Разобрался с помощью кого-то на другом сайте. Оказывается, все мои запросы к серверу использовали протоколы IPv6, что может привести к всевозможным случайным задержкам, если ваша настройка DNS не идеальна. Принуждение моего приложения к использованию протоколов IPv4 немедленно устранило проблему.

Обратите внимание, что запросы к хосту HTTPS требуют правильной работы заголовков запросов.

Вот код, который работал для меня, я надеюсь, это поможет кому-то другому:

    public static HttpClient Client = new HttpClient();

    public MainWindow()
    {
        InitializeComponent();

        // Set required security protocols.
        ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

        // Set Host header required for HTTPS connections.
        Client.DefaultRequestHeaders.Add("Host", "api.themoviedb.org");
    }

    private async void button_Click(object sender, RoutedEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.Wait;

        // Get DNS entries for the host.
        Uri uri = new Uri("https://api.themoviedb.org/3/search/person?api_key=" + theMovieDbKey + "&query=%22Hanks%22");
        var hostEntry = Dns.GetHostEntry(uri.Host);

        // Get IPv4 address
        var ip4 = hostEntry.AddressList.First(addr => addr.AddressFamily == AddressFamily.InterNetwork);

        // Build URI with numeric IPv4
        var uriBuilderIP4 = new UriBuilder(uri);
        uriBuilderIP4.Host = ip4.ToString();
        var uri4 = uriBuilderIP4.Uri;

        // Retrieve asynchronous string from specified URI.
        HttpResponseMessage response = await Client.GetAsync(uri4);
        string content = await response.Content.ReadAsStringAsync();
        Mouse.OverrideCursor = null;
        MessageBox.Show(content);
    }
...