[英]How do I know how many connections are opened by my webclient?
我有一個簡單的 webclient,它只是將 POST 消息發送到服務器並獲得響應。 我通過覆蓋 System.Net.WebClient)' 的 GetWebRequest(...)' 來設置KeepAlive=true
以使用持久連接。
我的客戶端與之通信的服務器對我可以打開的連接數有限制(我猜是為了避免 DoS 攻擊!)。 我的客戶端只是並行地對該服務器執行一堆查詢 - 所以為了限制我對服務器發出的請求數量,我使用了信號量(請參閱代碼片段) - 即確保我沒有超過任何給定的連接限制時間。
但是,在特定客戶的環境中,服務器通過說“已達到連接限制”來主動拒絕請求。
我的問題:
我如何知道在任何給定時刻,我的客戶端對服務器打開了多少個連接? 我正在使用 Fiddler - 但不太確定此信息是否可用?
由於我限制使用信號量發出的請求數量(在本例中為 75),假設其他客戶端或應用程序從客戶的盒子到服務器沒有打開連接,那么 .net 是否有可能打開超過“75”持久連接,因為我將“保持活動”設置為 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;
}
}
也許這可能會有所幫助...
http://www.codeproject.com/Articles/23306/ASP-NET-Performance-and-Scalability-Secrets
查看標題為“防止拒絕服務 (DOS) 攻擊”的部分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.