1

スレッドを使用してサーバーで http ポスト要求を作成することを目的とした C# のアプリケーションがあります。(これは問題を単純化するためです。実際には、異なる URI でリクエストを行ういくつかの異なる trhead があるためです)

これらのトレッドは、異なる期間に要求を行うように設定されていることがわかりました。しかし、私は自分のサーバーでフラッドを検出しています。これは、常に同じ ips から大量のシーケンスで発生するものであり、そうではありませんでした。- DDoS 攻撃のようなものです。そして実際、私のサーバーはそれに対処するのに深刻な問題を抱えています。

個人的には、これは攻撃ではないと考えていますが、何千もの顧客に配布されている私の C # アプリケーションに何か問題があるのではないかと考えています。約10,000。その場合、多くても 1 日あたり 10,000 件のリクエストになります。しかし、実際にはもっと多くの...

私のサーバーはPythonです。

以下に、これらの要求を行うコード例をトレッドに貼り付けます。私はそれをすべて説明し、私が見ることができない誰かが見ることができることを願ってコードを表示しています。何か問題がありましたら、どうぞよろしくお願いいたします。

DateTime nextCheck= DateTime.Now;
void checkLicenses()
{
    // 5 minutes
    autoResetEvent.WaitOne(300000, true);
    while (this.ServiceAlive)
    {

        if (DateTime.Now < nextCheck)
        {
            autoResetEvent.WaitOne(30000, true);
            continue;
        }

        if (this.InternetIsOk)
        {
            Monitor.Record("Executing checkLicenses...", Mode.Console, false);

            licenseRequest = new LicenseRequest()
            {
                token = this.GetToken(),
                licensesList = Data.GetLicensesToValidate()
            };

            string json = JsonConvert.SerializeObject(licenseRequest, Formatting.Indented);
            var jsonBytes = Encoding.Default.GetBytes(json);


            string URI = AplicationConf.GetWebServiceAddress() + "/checklicense";
            var uri = new Uri(URI);
            var servicePoint = ServicePointManager.FindServicePoint(uri);
            servicePoint.Expect100Continue = false;
            System.Net.ServicePointManager.Expect100Continue = false;

            string response = "";
            using (WebDownload wc = new WebDownload())
            {
                wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
                wc.Credentials = CredentialCache.DefaultCredentials;
                wc.Proxy = GetProxyData();
                wc.Timeout = 60000;

                Monitor.Record("Post in URI: " + URI, Mode.Console, false);
                var postResponse = wc.UploadData(URI, "POST", jsonBytes);
                response = Encoding.Default.GetString(postResponse);
            }

            if (!String.IsNullOrEmpty(response))
            {
                List<ResponseLicense> responseLicense = JsonConvert.DeserializeObject<List<ResponseLicense>>(response);
                Data.UpdateLicense(responseLicense);
            }

            Monitor.Record("CheckLicense finish");
        }
        nextCheck = DateTime.Now.AddHours(24);
    }
}

アップデート

このアプリケーションは、HostServer というクラスを含む WCF サービスです。このクラスには、サービスの起動時に一度だけ呼び出される Start () メソッドがあります。このメソッド「開始」は、thead を作成します。(checkLicenses () メソッドは trhead です)。以下は Start() コードの一部です。

public void Start (bool consoleRunning = false)
{

   // code above

   trheadCheckLicense = new Thread (new ThreadStart (checkLicense));
   trheadCheckLicense.Priority = ThreadPriority.Normal;
   trheadCheckLicense.Name = "trheadCheckLicense";
   trheadCheckLicense.Start();

  // More code below

}

4

1 に答える 1

2

CheckLicense コードは例外をキャッチしませんでした。サービスが失敗時に再起動するように構成されている場合。そして、autoResetEvent は new AutoResetEvent(true); のように作成されました。あなたはループを取得します:

1 service starting
2 go to check license
3 send request
4 get exception somewhere
5 crash
6 restart again
于 2015-01-16T12:09:27.337 に答える