我有一个简单的webclient,它只是将POST消息发送到服务器并获取响应。我通过覆盖System.Net.WebClient的GetWebRequest(...)'来设置' KeepAlive = true '以使用持久连接。
我的客户端与之通信的服务器对我可以打开的连接数量有限制(我想这是为了避免d-o-s攻击!)。 我的客户端只是并行地对这个服务器执行一堆查询 - 所以为了限制我对服务器的请求数量我使用了一个信号量(请参阅代码片段) - 即确保我没有超过任何给定的连接限制时间。
然而,在特定客户的环境中,服务器通过说“已达到连接限制”来主动拒绝请求。
我的问题
我如何在任何特定时刻知道我的客户端对服务器打开了多少连接?我正在使用提琴手 - 但不太确定这些信息是否可用?
由于我限制了使用信号量进行的请求数量(在此示例中为75),假设其他客户端或应用程序没有从客户的盒子到服务器打开连接,是否有可能.net因为我将'keep alive'设置为true,所以打开了超过'75'的持久连接。我的猜测是,因为最多只有75个请求,连接不应超过75,所有进一步的请求只是重用现有的连接。但是,因为我看不到 - 我猜不出来。
这些可能是基本的.net网络调试问题w.r.t服务编程 - 我是新手,所以任何参考都值得赞赏!
使用信号量限制并发请求数:
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();
}
我的网络客户端(通过覆盖GetWebRequest将设置保持活动状态):
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;
}
}
答案 0 :(得分:0)
也许这可能会有所帮助......
http://www.codeproject.com/Articles/23306/ASP-NET-Performance-and-Scalability-Secrets
查看标题为“防止拒绝服务(DOS)攻击”的部分