2011-12-20 27 views
2

MSDN says HttpListener基于http.sys,“HTTP.sys提供连接管理,带宽限制和Web服务器日志记录”。HttpListener限制?

我需要限制连接到服务器的最大数量。用HttpListener做这件事的最好方法是什么?

回答

1

如果您使用HttpListener,这意味着您负责提供请求/响应处理。如果您要在应用程序中创建HttpListener的新实例,请添加一个前缀并调用Start,直到您的代码调用GetContext或BeginGetContext,您的应用程序代码才会响应传入的请求。

如果您调用BeginGetContext(异步),它将只处理一个请求,直到再次调用BegingGetContext。所以它自然是有限的(只有一个连接)。如果你调用了两次,它会处理两次,依此类推。虽然连接尝试可能“排队”,但它们只能一次处理一个。

0

HttpListener维护一个挂起连接的内部队列,所以只是“不接受连接”在这里没有帮助,你需要清除它的队列。这可以通过线程池(.NET < = 4.0)或异步连接(4.5+)进行管理。

“线程池+队列”方法的一个示例是Grapevine。在我的R & D分支中,Interpspecific,我已经增强了这个功能来限制未决请求的数量。它清除HttpListener队列,并在队列“满”时拒绝有500个错误的请求。从RESTServer.c

private void HandleRequests() 
    { 
     // Immediately accept and handle any requests: 
     while (this.IsListening) 
     { 
      try 
      { 
       var context = this._listener.GetContext(); 
       this.QueueRequest(context); 
      } 
      catch (Exception e) 
      { 
       EventLogger.Log(e); 
      } 
     } 
    } 

    private void QueueRequest(HttpListenerContext context) 
    { 
     lock (this._queue) 
     { 
      if (_queue.Count > MaxPendingRequests) 
      { 
       context.Response.StatusCode = 503; 
       context.Response.OutputStream.Close(); 
       context.Response.Close(); 
       EventLogger.Log(
        String.Format("Request queue max size reached: {0}. Connection refused with 503 error.", 
            MaxPendingRequests)); 
       return; 
      } 

      this._queue.Enqueue(context); 
      this._ready.Set(); 
     } 
    } 

这限制了总的连接数到MaxPendingRequests线程拉动从所述队列中的连接+的数量。 Hanlder线程从队列中拉出(作为练习留给读者,或者参见RESTServer.c举例)。

如果您使用异步方法(更具可扩展性但仅支持4.5+),则接受循环和连接限制将会有所不同,但总体思路是相同的:立即接受HttpListenerContext并返回500,如果您也是“太忙”。