我怎么知道我的webclient打开了多少个连接?

时间:2014-03-11 01:34:39

标签: c# asp.net .net web-services

我有一个简单的webclient,它只是将POST消息发送到服务器并获取响应。我通过覆盖System.Net.WebClient的GetWebRequest(...)'来设置' KeepAlive = true '以使用持久连接。

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

然而,在特定客户的环境中,服务器通过说“已达到连接限制”来主动拒绝请求。

我的问题

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

  2. 由于我限制了使用信号量进行的请求数量(在此示例中为75),假设其他客户端或应用程序没有从客户的盒子到服务器打开连接,是否有可能.net因为我将'keep alive'设置为true,所以打开了超过'75'的持久连接。我的猜测是,因为最多只有75个请求,连接不应超过75,所有进一步的请求只是重用现有的连接。但是,因为我看不到 - 我猜不出来。

  3. 这些可能是基本的.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;
    
            }        
    
        }
    

    相关链接

    1. How can I programmatically remove the 2 connection limit in WebClient

    2. Max number of concurrent HttpWebRequests

    3. Trying to run multiple HTTP requests in parallel, but being limited by Windows (registry)

    4. How to Set or Increase Number of Persistent HTTP Connections in C#/.NET 最诚挚的问候!

1 个答案:

答案 0 :(得分:0)

也许这可能会有所帮助......

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

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