HttpListener throttling?



MSDN说HttpListener基于http。sys和"HTTP. sys"。sys提供连接管理、带宽限制和Web服务器日志。"

我需要限制到服务器的最大连接数。使用HttpListener进行此操作的最佳方法是什么?

HttpListener维护一个挂起连接的内部队列,因此简单地"不接受连接"在这里没有帮助,您需要清除它的队列。这可以通过线程池()来管理。. NET <= 4.0)或使用异步连接(4.5+)。

"线程池+队列"方法的一个例子是Grapevine。在我的研发部门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 +从队列中提取连接的线程数。句柄线程从队列中提取(留给读者作为练习,或者参见RESTServer.c中的示例)。

接受循环和连接限制将是不同的,如果你正在使用异步的方法(更可扩展,但只有4.5+),但一般的想法是相同的:接受HttpListenerContexts立即和返回500,如果你"太忙"

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

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

相关内容

  • 没有找到相关文章

最新更新