Тема в C#, которая делает сообщение на моем сервере - Flood
У меня есть ПРИЛОЖЕНИЕ в C #, которое направлено на выполнение запросов HTTP post на моем сервере с использованием потоков. (Это для упрощения вопроса, потому что на самом деле есть несколько разных транзитов, которые делают запросы на разных URI)
Оказывается, что эти ступени настроены на выполнение запросов в разные периоды времени. Но я обнаруживаю флуд на моем сервере, всегда приходя с одних и тех же ips и в огромных последовательностях, чего не должно было быть. - Это как DDoS-атака! И действительно, у моего сервера серьезные проблемы с этим.
Лично я не думаю, что это атака, а скорее что-то не так с моим C # приложением, которое распространяется среди тысяч клиентов. Примерно 10000 Тогда самое большее 10 тысяч запросов в день. Но на самом деле есть еще...
Мой сервер в 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);
}
}
ОБНОВИТЬ
Это приложение представляет собой Службу WCF, которая содержит класс HostServer. Этот класс имеет метод Start (), который вызывается только один раз при запуске службы. Этот метод "Пуск" создает ветви. (Метод 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
}
1 ответ
Ваш код CheckLicense не уловил никаких исключений. Если служба настроена на перезапуск при сбое. И ваш autoResetEvent создан как новый AutoResetEvent(true); Вы получаете петлю:
1 service starting
2 go to check license
3 send request
4 get exception somewhere
5 crash
6 restart again