我有一个基于HTTP的API,我可能需要多次调用它。问题是我无法获得少于约20秒的请求,尽管通过浏览器发出的相同请求几乎是即时的。以下代码说明了到目前为止我是如何实现它的。
WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla");
var response = r.GetResponse();
一种解决方案是提出异步请求,但我想知道为什么需要这么长时间,如果我可以避免它。我也尝试过使用WebClient类,但我怀疑它在内部使用了WebRequest。
更新
在发布模式下运行以下代码大约需要40秒(使用秒表测量):
WebRequest g = HttpWebRequest.Create("http://www.google.com");
var response = g.GetResponse();
我在大学工作,网络配置可能会有不同的因素影响性能,但直接使用浏览器表明它应该接近即时。
更新2:
我将代码上传到远程计算机并且工作正常,因此结论必须是.NET代码与浏览器相比做了额外的事情,或者它在通过大学网络解决地址时遇到了问题(代理问题还是什么?! )。
答案 0 :(得分:30)
此问题类似于StackOverflow上的另一篇文章: Stackoverflow-2519655(HttpWebrequest is extremely slow)
大多数情况下,问题是代理服务器属性。您应该将此属性设置为null,否则对象将尝试在直接转到源之前搜索要使用的相应代理服务器。注意:默认情况下,此属性处于启用状态,因此您必须明确告知对象不要执行此代理搜索。
request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}
答案 1 :(得分:13)
我在“第一次”尝试时有30秒的延迟 - JamesR对另一篇提及将代理设置为null的帖子立即解决了它!
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url);
request.Proxy = null; // <-- this is the good stuff
...
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
答案 2 :(得分:3)
您的网站是否有无效的SSL证书?尝试添加此
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AlwaysAccept);
//... somewhere AlwaysAccept is defined as:
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
public bool AlwaysAccept(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
答案 3 :(得分:2)
您不会关闭您的请求。一旦达到允许的连接数,就必须等待先前的连接超时。试试
using (var response = g.GetResponse())
{
// do stuff with your response
}