1

我在 C# 中有一个应用程序,旨在使用线程在我的服务器中发出 http post 请求。(这是为了简化问题,因为事实上,有几个不同的 trhead 在不同的 URI 上发出请求)

事实证明,这些踏板被设置为在不同的时间段发出它们的请求。但是我在我的服务器上检测到洪水,总是来自相同的 ips 并且以巨大的顺序出现,这是不应该的。- 这就像 DDoS 攻击!事实上,我的服务器在处理它时遇到了严重的问题。

个人认为这不是攻击,而是我分发给成千上万客户的 C# 应用程序可能有问题。大约 10,000 个。然后,每天最多 10K 请求。但其实还有更多...

我的服务器是 Python 的。

在下面,我将在发出这些请求的tread 中粘贴一个代码示例。我正在解释这一切并显示代码,希望有人能看到我看不到的。如果您发现有问题,请,您的帮助将不胜感激。

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);
    }
}

更新

此应用程序是一个 WCF 服务,其中包含一个名为 HostServer 的类。此类有一个 Start () 方法,该方法仅在服务启动时调用一次。此方法“开始”创建 trheads。(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 回答