我正在尝试构建一个发送和接收来自网站的响应的应用程序。
我在Stack Overflow上阅读的解决方案都没有解决我的问题,所以我认为我的代码可以使用优化。
我有以下主题:
void DomainThreadNamecheapStart()
{
while (stop == false)
{
foreach (string FromDomainList in DomainList.Lines)
{
if (FromDomainList.Length > 1)
{
// I removed my api parameters from the string
string namecheapapi = "https://api.namecheap.com/foo" + FromDomainList + "bar";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(namecheapapi);
request.Proxy = null;
request.ServicePoint.Expect100Continue = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
status.Text = FromDomainList + "\n" + sr.ReadToEnd();
sr.Close();
}
}
}
}
单击按钮时会调用此线程:
private void button2_Click(object sender, EventArgs e)
{
stop = false;
Thread DomainThread = new Thread(new ThreadStart(DomainThreadNamecheapStart));
DomainThread.Start();
}
我只使用上面的代码在10秒内收到大约12个回复。当我尝试在JavaScript中使用简单的IFrame进行相同的请求时,它的速度提高了两倍多。浏览器不使用多个线程进行连接,它等待一个完成后再启动新线程。
我尝试设置request.Proxy = null;
,但影响可以忽略不计。
我注意到HTTPS
比HTTP
慢2-3倍。不幸的是,我必须使用HTTPS
。我有什么办法可以让它更快吗?
答案 0 :(得分:5)
我的赌注是你指出的方面 - HTTPS协议。
客户端(浏览器)和服务器之间针对纯HTTP协议的迭代非常简单:询问信息,获取信息。如果1.0,关闭连接;如果1.1,它可以保持活着以便重复使用。 (有关详细信息,请查看图像1。)
但是,当您执行HTTPS请求时,初始协议开销很大(图2);但是,一旦初始协商完成,就会发生一些对称加密,不需要进一步的证书协商,从而加快数据传输速度。
我认为问题在于,如果您销毁HTTPWebRequest对象并创建一个新对象,则会再次进行完整的HTTPS交换,从而减慢您的迭代速度。 (HTTPS + HTTP 1.1 Keepalive应该可以。)
所以,建议:仅切换到HTTP,或重用连接对象。
我希望它适合你。 =)
(1)HTTP协议握手和响应
(2)初始HTTPS协议握手
答案 1 :(得分:2)
尝试修改System.Net.ServicePointManager.DefaultConnectionLimit值(默认值为2)。
其他reference(效果问题部分)。
答案 2 :(得分:2)
尝试这些,它帮助我提高了性能,
ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 200;
ServicePointManager.MaxServicePointIdleTime = 2000;
ServicePointManager.SetTcpKeepAlive(false, 0, 0);