我如何知道我的web客户端打开了多少连接?

本文关键字:多少 连接 客户端 何知道 我的 web | 更新日期: 2023-09-27 17:49:19

我有一个简单的web客户端,它只是发送POST消息到服务器并获得响应。我通过重写GetWebRequest(…)' of System.Net.WebClient)'来设置KeepAlive=true以使用持久连接。

并且我的客户端与之通信的服务器对我可以打开的连接数量有限制(我猜是为了避免DoS攻击!)我的客户端只是对这个服务器并行执行一堆查询——所以为了限制我对服务器发出的请求数量,我使用了一个信号量(请参阅代码片段)——即确保我在任何给定的时间都没有超过连接限制。

然而,在一个特定的客户环境中,服务器正在主动拒绝请求,说"连接限制已达到"。

我的问题:

  1. 我如何知道在任何给定的时刻,我的客户端打开了多少连接到服务器?我正在使用小提琴手-但不太确定这个信息是否可用?

  2. 由于我限制了使用信号量(在本例中为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;
        }        
    }

相关链接

  1. 如何以编程方式删除WebClient中的2个连接限制

  2. 最大httpwebrequest并发数

  3. 试图并行运行多个HTTP请求,但受到Windows(注册表)的限制

  4. 如何在c#/中设置或增加持久HTTP连接的数量。净

我如何知道我的web客户端打开了多少连接?

也许这有帮助…

http://www.codeproject.com/Articles/23306/ASP-NET-Performance-and-Scalability-Secrets

查看标题为"防止拒绝服务(DOS)攻击"的部分