我在 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
}