如何提高HttpWebResponse的性能?

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;,但影响微乎其微。

我注意到HTTPSHTTP慢2-3倍。不幸的是,我必须使用HTTPS。有什么方法可以让它更快吗?


4
  • "C#比浏览器慢!" - "浏览器是用C++编写的!"
- user529758
4
注:status.Text = ... 看起来很像你正在从非 UI 线程访问 UI 组件。 - Damien_The_Unbeliever
1
@H2CO3,我不认为这样就会使它变得超过两倍的慢。很可能不是请求本身,而只是代码在这里编写的方式。事实上,OP没有计时请求,不幸的是,OP正在计时整个过程,虽然这可以帮助你找到根本原因,但你仍然需要深入挖掘。我认为真正的问题是它是否足够快。 - Mike Perrenoud
1
@Tumay,这是你必须接受的事实,因为由于加密,https 总会存在开销。 - Mike Perrenoud
1
浏览器也应该遭受https减速的影响。 - Wutz
显示剩余8条评论
3个回答

5
我猜测问题在于您所指出的HTTPS协议。对于纯HTTP协议的客户端(浏览器)与服务器之间的迭代,相当简单:请求信息并获取信息。如果是1.0版本,则关闭连接;如果是1.1版本,则可重用连接。(详见图1)
但是,当您进行HTTPS请求时,初始协议开销相当大(图2);但是,一旦初始协商完成,将进行一些对称加密,并且不需要进一步进行证书协商,从而加快数据传输。
我认为问题在于,如果您销毁HTTPWebRequest对象并创建新对象,则完整的HTTPS交换会再次进行,从而减缓您的迭代速度。(HTTPS + HTTP 1.1 Keepalive应该可以胜任。)
因此,建议:切换到仅使用HTTP或重用连接对象。 希望对您有帮助。=) (1)HTTP协议握手和响应 (图1) (2)初始HTTPS协议握手 (图2)

谢谢您的清晰解释,它帮助我更好地理解了事情。虽然我无法删除 https,但我将不得不找到一种方法来保持其运行并使其使用相同的连接对象。我仍然很新C#,所以需要些时间来找出如何做到这一点,但我喜欢挑战! :) - Tumay
当然欢迎!这里有一篇关于HTTP与HTTPS性能的好文章,适合轻松阅读。链接如下:https://dev59.com/pHVC5IYBdhLWcg3w51ny - OnoSendai

2

试试这些方法,它们帮助我提高了性能。

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 200;
        ServicePointManager.MaxServicePointIdleTime = 2000;
        ServicePointManager.SetTcpKeepAlive(false, 0, 0);

2

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