3

我正在尝试构建一个从网站发送和接收响应的应用程序。

我在 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慢 2-3 倍HTTP。不幸的是,我必须使用HTTPS. 我能做些什么来让它更快吗?

4

3 回答 3

5

我敢打赌您指出的方面 - HTTPS 协议。

纯 HTTP 协议的客户端(浏览器)和服务器之间的迭代非常简单:询问信息,获取信息。如果为 1.0,则关闭连接;如果是 1.1,它可能会保持活动状态以供重用。(有关详细信息,请查看图 1。)

但是当你做一个 HTTPS 请求时,初始协议开销是相当大的(图 2);但是,一旦完成初始协商,就会发生一些对称加密,不需要进一步的证书协商,从而加快数据传输速度。

我认为问题在于,如果您销毁 HTTPWebRequest 对象并创建一个新对象,则会再次进行完整的 HTTPS 交换,从而减慢您的迭代速度。(不过,HTTPS + HTTP 1.1 Keepalive 应该没问题。)

因此,建议:仅切换到 HTTP,或重用连接对象。

我希望它对你有用。=)

(1) HTTP协议握手和响应 HTTP 协议握手和响应

(2) 初始HTTPS协议握手 在此处输入图像描述

于 2012-12-28T15:57:08.087 回答
2

尝试修改System.Net.ServicePointManager.DefaultConnectionLimit值(默认值为 2)。

其他参考性能问题部分)。

于 2012-12-28T15:49:26.300 回答
2

试试这些,它帮助我提高了性能,

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 200;
        ServicePointManager.MaxServicePointIdleTime = 2000;
        ServicePointManager.SetTcpKeepAlive(false, 0, 0);
于 2012-12-28T17:51:45.803 回答