-1

httpwebrequest\webclient を使用してサイトからデータをフェッチしようとしているので、30 秒ごとにサイトの html を取得するリクエストを送信しています。

何が起こっているのかというと、私がコンピュータからあまりにも多くのリクエストを送信したため、サービス拒否攻撃に対してサイトが私をブロックしているということです.

30 秒ごとにデータをフェッチせずに、サイトに新しいデータがあることを知るにはどうすればよいですか?

また

DoS 攻撃でブロックされることなく、30 秒ごとにサイトからデータを取得するにはどうすればよいですか?

わかりましたので、いくつかのコードを追加します:

public void DownloadFile(String remoteFilename, String localFilename)
{
            Stream remoteStream = null;
            Stream localStream = null;
            HttpWebRequest gRequest = (HttpWebRequest)WebRequest.Create(remoteFilename);
            gRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTBDFff GTB7.0";

            gRequest.CookieContainer = new CookieContainer();
            gRequest.Accept = " text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, */*";
            gRequest.KeepAlive = true;
            gRequest.ContentType = @"application/x-www-form-urlencoded";


            #region CookieManagement
            if (gCookies != null && gCookies.Count > 0)
            {
                gRequest.CookieContainer.Add(gCookies);
            }

            HttpWebResponse gResponse;

            try{
                gResponse = (HttpWebResponse)gRequest.GetResponse();

                //check if the status code is http 200 or http ok

                if (gResponse.StatusCode == HttpStatusCode.OK)
                {
                    remoteStream = gResponse.GetResponseStream();
                    localStream = File.Create(localFilename);
                    byte[] buffer = new byte[1024];
                    int bytesRead;

                    do
                    {
                        // Read data (up to 1k) from the stream
                        bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

                        // Write the data to the local file
                        localStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead > 0);
                }
                else
                {
                    MessageBox.Show("Error!");
                    Application.Exit();
                }

                if (gResponse != null) gResponse.Close();
                if (remoteStream != null) remoteStream.Close();
                if (localStream != null) localStream.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                Application.Exit();
            }
            #endregion
        }

そしてタイマーで:

DownloadFile("http://www.fxp.co.il/forumdisplay.php?f=2709", @"C:\tmph.html");

このフォーラムは売買フォーラムなので、30 秒ごとにフォーラムの html を取得し、htmlagilitypack を使用して未読の「購入」投稿の数を html で確認します。

4

1 に答える 1

1

より長いポーリング間隔を使用して HEAD リクエストを実行すると、ドキュメント全体のフェッチを回避できます。返されたヘッダーを解析し、前のヘッダーと異なる場合にのみ GET を実行できます。

于 2012-05-02T21:15:53.807 に答える