我试图从网站上获取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);
}
到目前为止,我已经试过了,但没有成功。
这个Fiddler屏幕上的第二项显示了一些信息。
这里是标题
任何帮助都将是非常感激的 因为我不知道是什么原因造成的
EDIT:浏览器请求成功后的头信息是。
在另一个网站上的人的帮助下,我想通了。 事实证明,我的服务器请求都使用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);
}