gpt4 book ai didi

c# - 在我的服务器上发布帖子的 C# 线程 - Flood

转载 作者:行者123 更新时间:2023-12-01 04:53:25 25 4
gpt4 key购买 nike

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

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

我个人并不认为这是一次攻击,而是认为我分发给数千个客户的 C# 应用程序可能出了问题。大约10,000。那么每天最多会产生 10K 个请求。但事实上还有更多...

我的服务器使用 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 () 方法,该方法仅在服务启动时调用一次。此方法“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

}

最佳答案

您的 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

关于c# - 在我的服务器上发布帖子的 C# 线程 - Flood,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27982962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com