如何在C#中进行快速的Web请求

28

我有一个基于HTTP的API,可能需要调用多次。问题是,尽管通过浏览器进行相同的请求几乎瞬间完成,但我无法让请求时间少于约20秒。以下代码展示了我到目前为止如何实现它。

WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla");
var response = r.GetResponse();

一个解决方案是进行异步请求,但我想知道为什么它需要这么长时间以及我是否可以避免这种情况。我还尝试过使用WebClient类,但我怀疑它内部使用了WebRequest。

更新:

在发布模式下运行以下代码大约需要40秒钟(使用Stopwatch测量):

WebRequest g = HttpWebRequest.Create("http://www.google.com");
var response = g.GetResponse();

我在一所大学工作,可能有不同的网络配置影响性能,但是直接使用浏览器可以近乎瞬间完成。

更新2:

我将代码上传到远程机器上,它能够正常运行,因此结论是.NET代码与浏览器相比做了额外的事情,或者它在大学网络中解析地址时存在问题(代理问题或其他问题?!)。


6
您是如何确定是网络请求导致了延迟?我通常使用HttpWebRequest类不会出现性能问题。您是否尝试过让应用程序执行多个调用,如果尝试了,所有调用的时间都需要这么长吗? - Fredrik Mörk
1
所有的URL都会发生这种情况吗,比如google.com?使用非SSL URL呢? - tbreffni
是的,Fredrik的评论和建议非常好。HttpWebRequest没有任何理由表现不佳(更不用说那么不好了)-毕竟它使用的是与浏览器相同的协议。 - Noldorin
你在获取网页响应,例如“http://www.google.com”时,是否遇到了相同的性能问题? - Juri
你正在使用调试模式吗?在调试模式下需要20-30秒的请求,在发布模式下往往可以瞬间完成。 - John Kraft
4个回答

31

这个问题类似于StackOverflow上的另一篇帖子: Stackoverflow-2519655(HttpWebrequest is extremely slow)

大部分情况下,问题在于代理服务器属性。您应该将此属性设置为null,否则对象将尝试搜索适当的代理服务器,然后再直接访问源。请注意:此属性默认为打开状态,因此您必须明确告诉对象不要执行此代理搜索。

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}

1
点赞,看起来对于HttpClient也是适用的。 - Maksym Strukov

13

我在第一次尝试中出现了30秒的延迟 - JamesR提到另一篇帖子提到将代理设置为null立即解决了这个问题!

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url);
request.Proxy = null; // <-- this is the good stuff

...

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

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;
}

2

您没有关闭请求。一旦达到允许的连接数量,您必须等待较早的连接超时。请尝试:

using (var response = g.GetResponse())
{
    // do stuff with your response
}

允许连接的限制是多少?是2吗? - Prashant Pimpale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接