我如何知道我的web客户端打开了多少连接?
本文关键字:多少 连接 客户端 何知道 我的 web | 更新日期: 2023-09-27 17:49:19
我有一个简单的web客户端,它只是发送POST消息到服务器并获得响应。我通过重写GetWebRequest(…)' of System.Net.WebClient)'来设置KeepAlive=true
以使用持久连接。
并且我的客户端与之通信的服务器对我可以打开的连接数量有限制(我猜是为了避免DoS攻击!)我的客户端只是对这个服务器并行执行一堆查询——所以为了限制我对服务器发出的请求数量,我使用了一个信号量(请参阅代码片段)——即确保我在任何给定的时间都没有超过连接限制。
然而,在一个特定的客户环境中,服务器正在主动拒绝请求,说"连接限制已达到"。
我的问题:
-
我如何知道在任何给定的时刻,我的客户端打开了多少连接到服务器?我正在使用小提琴手-但不太确定这个信息是否可用?
-
由于我限制了使用信号量(在本例中为75)的请求数量,假设没有其他客户端或应用程序从客户的盒子打开到服务器的连接,是否有可能。net打开超过'75'的持久连接,因为我将'keep alive'设置为true。我的猜测是,由于最多只有75个请求,连接不应该超过75个,并且所有进一步的请求都只是重用现有的连接。但是,因为我看不见——我不能确认,我猜。
使用信号量限制并发请求数:
Semaphore semaphore = new Semaphore(initialCount:75, maximumCount:75);
try
{
//at any given time do not send more than 75 requests to server
semaphore.WaitOne();
using (var myWebClient = new MyWebClient(timeoutSeconds: 300, useragent: "dreamer"))
{
byte[] responseBytes = myWebClient.UploadData("http://myserverurl",
UTF8Encoding.UTF8.GetBytes("inputMessageRequest"));
}
}
finally
{
semaphore.Release();
}
我的Web客户端(通过重写GetWebRequest将keep alive设置为true):
class MyWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
request.UserAgent = this.UserAgent;
request.KeepAlive = true;
request.Timeout = this.TimeoutSeconds;
request.PreAuthenticate = true;
return request;
}
public int TimeoutSeconds { get; set; }
public string UserAgent { get; set; }
public MyWebClient(int timeoutSeconds, string useragent)
{
this.TimeoutSeconds = timeoutSeconds;
this.UserAgent = useragent;
}
}
相关链接
如何以编程方式删除WebClient中的2个连接限制
最大httpwebrequest并发数
试图并行运行多个HTTP请求,但受到Windows(注册表)的限制
如何在c#/中设置或增加持久HTTP连接的数量。净
也许这有帮助…
http://www.codeproject.com/Articles/23306/ASP-NET-Performance-and-Scalability-Secrets查看标题为"防止拒绝服务(DOS)攻击"的部分