c# - 如何提高 HttpWebResponse 的性能?

标签 c# performance https httpwebrequest

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

我在 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。我可以做些什么来让它更快吗?

最佳答案

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

纯 HTTP 协议(protocol)的客户端(浏览器)和服务器之间的迭代非常简单:请求信息,获取信息。如果为 1.0,则关闭连接;如果是 1.1,它可能会存活以供重用。 (查看图 1 了解详情。)

但是当您执行 HTTPS 请求时,初始协议(protocol)开销相当大(图 2);但是,一旦初始协商完成,就会进行一些对称加密,并且不需要进一步的证书协商,从而加快数据传输。

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

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

我希望它对你有用。 =)

(一)HTTP协议(protocol)握手与响应 HTTP protocol handshake and response

(2) 初始HTTPS协议(protocol)握手 enter image description here

关于c# - 如何提高 HttpWebResponse 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14071945/

相关文章:

c# - PayPal 定期捐款分期付款

iphone - 在 iPhone 上绘制几条直线和圆圈时 CGContextStrokePath 的性能不佳

wordpress - 有什么方法可以将 AWS Cloudfront 设置为指向静态 IP 地址(托管在 GoDaddy 上的 WP)?

node.js - Node : PORT 443 requires elevated privileges error

c# - 我如何判断我的方法是否被与主 UI 线程不同的线程调用?

c# - 如何在 Active Directory 中对密码更改进行客户端验证

c# - Unity,将立方体贴图保存为一个圆形图像

c++ - virtual 关键字与 *derived* 类中的函数对性能的影响

sql-server - Entity Framework Power Tools 扩展的源代码是否可用?如果没有,它会永远存在吗?

https - 让 wildfly 监听端口 443 而不是 8443