0

これの底に到達しようとしています!

httpwebrequestsを使用してログインし、ページに移動して、そのページのhtmlを取得する非常に基本的なアプリがあります。次に、ループ内で5分ごとに3番目のページに別のWebリクエストを実行します。

すべて正常に動作し、シングルスレッド(およびかなり古い)ですが、状況が変化したため、このアプリの複数のインスタンスを密接に実行する必要があります(.batは、可能になるまで一時的な手段として2秒ごとにアプリを起動します新しいマルチスレッドソリューションをコーディングするため)。

アプリの最初のインスタンスがすべて正常に起動すると、最初のリクエストは約2秒で完了します。約3秒で2番目。

ただし、このアプリのインスタンスがますます多く同時に実行されると(> 100)、何か奇妙なことが起こり始めます。

最初のWebリクエストにはまだ2秒ほどかかりますが、2番目のリクエストはタイムアウトになるまで1分以上遅れます。なんでこんなのかわからないようです。2番目のページは最初のページよりも大きくなっていますが、ダウンロードに1分以上かかる通常のページとは異なります。

このサーバーのインターネット接続とハードウェアは、これらの要求を処理する能力を超えています。

 CookieContainer myContainer = new CookieContainer();
        // first request is https
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(https://mysite.com/urlone);                                
        request.CookieContainer = myContainer;
        request.Proxy = proxy;
        Console.WriteLine(System.DateTime.Now.ToLongTimeString() + "  " + "Starting login request");
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream resStream = response.GetResponseStream();

        string tempString = null;
        int count = 0;

        do
        {
            // fill the buffer with data
            count = resStream.Read(buf, 0, buf.Length);

            // make sure we read some data
            if (count != 0)
            {
                // translate from bytes to ASCII text
                tempString = Encoding.ASCII.GetString(buf, 0, count);

                // continue building the string
                sb.Append(tempString);
            }
        }
        while (count > 0); // any more data to read?
        sb.Clear();
       response.Close();
       resStream.Close();
       string output6;



        Console.WriteLine(System.DateTime.Now.ToLongTimeString() + "  " + "login request comeplete");
        HttpWebRequest request6 = (HttpWebRequest)WebRequest.Create(@"http://mysite.com/page2");
        request6.CookieContainer = myContainer;
        response = (HttpWebResponse)request6.GetResponse();
        resStream = response.GetResponseStream();
        tempString = null;
        count = 0;

        do
        {
            count = resStream.Read(buf, 0, buf.Length);


            if (count != 0)
            {
                tempString = Encoding.ASCII.GetString(buf, 0, count);

                sb.Append(tempString);
            }
        }

        while (count > 0);
        output6 = sb.ToString();
        sb.Clear();
        response.Close();
        resStream.Close();

何か案は?私はhttpWebリクエストについてあまり進んでいないので、誰かがチェックできれば、上記のばかげたコードの間違いを犯していないことを感謝します。私がここに含める必要があるかもしれない他の情報について途方に暮れています、私が何かを逃したならば、私に教えてください、そして私は提供するために最善を尽くします。前もって感謝します。

編集1:

私はフィドラーを使用して問題の原因を突き止めました。問題は、アプリケーション(またはWindows)が何らかの理由でリクエストを送信しないことにあるようです。フィドラーによると、物理的なリクエストは実際には1秒未満かかります。

4

2 に答える 2

2

いくつかのことをチェックしてください

  1. ServicePointManager.DefaultConnectionLimit:100を超える接続を開くことを計画している場合は、この値をのようなものに設定します200-300
  2. 可能であれば使用HttpWebRequest.KeepALive = true
于 2013-02-04T19:41:22.743 に答える
0

リクエストをusingディレクティブにラップして、常に適切に閉じられるようにしてください。接続の最大数に達した場合は、新しい接続が接続する前に、以前の接続がタイムアウトするのを待つ必要があります。

于 2013-08-12T08:41:30.533 に答える