当从网页地址访问JSON数据时,出现巨大的、不一致的延迟。

问题描述 投票:1回答:1

我试图从网站上获取JSON数据(如theoviedb.org)。 我可以成功地检索数据,但有时当我这样做时,会有一个巨大的延迟,可能持续超过一分钟,或者我得到一个连接失败的消息(服务器超时? 当这种情况发生时,问题会持续几个小时--但我可以在同一天晚上晚些时候尝试,同样的代码几乎立刻就能正常工作了!这就是为什么我可以成功检索数据的原因。

EDIT: 我还应该提到,当第一个延迟最终结束时,所有其他请求都会立即执行--只是第一个请求造成了很大的阻碍。 当我重新启动应用程序时,延迟又会重新发生。

这似乎不会影响我电脑上的任何其他互联网连接--而且我总是可以手动复制并粘贴相同的请求到我的浏览器中,以获得即时的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
  • 更改安全协议。
  • 停用代理服务器。
  • 禁用诊断工具。

这个Fiddler屏幕上的第二项显示了一些信息。

Fiddler results

这里是标题

Fiddler headers

任何帮助都将是非常感激的 因为我不知道是什么原因造成的

EDIT:浏览器请求成功后的头信息是。

enter image description here

c# json http-headers httpclient
1个回答
0
投票

在另一个网站上的人的帮助下,我想通了。 事实证明,我的服务器请求都使用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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.