簡體   English   中英

如何提高HttpWebResponse的性能?

[英]How do I increase the performance of HttpWebResponse?

我正在嘗試構建一個發送和接收來自網站的響應的應用程序。

我在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協議。

客戶端(瀏覽器)和服務器之間針對純HTTP協議的迭代非常簡單:詢問信息,獲取信息。 如果1.0,關閉連接; 如果1.1,它可以保持活着以便重復使用。 (查看圖片1了解詳情。)

但是,當您執行HTTPS請求時,初始協議開銷很大(圖2); 但是,一旦完成初始協商,就會發生一些對稱加密,不需要進一步的證書協商,從而加快了數據傳輸速度。

我認為問題是,如果您銷毀HTTPWebRequest對象並創建一個新對象,則會再次發生完整的HTTPS交換,從而減慢您的迭代速度。 (HTTPS + HTTP 1.1 Keepalive應該可以。)

所以,建議:僅切換到HTTP,或重用連接對象。

我希望它適合你。 =)

(1)HTTP協議握手和響應 HTTP協議握手和響應

(2)初始HTTPS協議握手 在此輸入圖像描述

嘗試修改System.Net.ServicePointManager.DefaultConnectionLimit值(默認值為2)。

其他參考性能問題部分)。

嘗試這些,它幫助我提高了性能,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM