3

Web サイトから応答を送受信するアプリケーションを構築しようとしています。

私が 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 を使用して同じリクエストを作成しようとすると、2 倍以上高速になります。ブラウザは接続に複数のスレッドを使用しません。1 つのスレッドが終了するまで待ってから、新しいスレッドを開始します。

を設定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 キープアライブは問題なく動作するはずです。)

したがって、提案: HTTP のみに切り替えるか、接続オブジェクトを再利用してください。

そして、それがあなたのために働くことを願っています. =)

(1) HTTPプロトコルのハンドシェイクとレスポンス HTTP プロトコルのハンドシェイクと応答

(2) 最初の HTTPS プロトコル ハンドシェイク ここに画像の説明を入力

于 2012-12-28T15:57:08.087 に答える
2

これらを試してみると、パフォーマンスが向上し、

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

System.Net.ServicePointManager.DefaultConnectionLimitの値を変更してみてください(既定値は 2 です)。

その他の参照(パフォーマンスの問題の部分)。

于 2012-12-28T15:49:26.300 に答える