首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpListener节流?

HttpListener节流?
EN

Stack Overflow用户
提问于 2011-12-21 01:47:49
回答 2查看 2.3K关注 0票数 2

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

我需要限制到服务器的最大连接数。使用HttpListener实现这一点的最佳方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2012-02-26 04:31:03

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

如果调用BeginGetContext (异步),它将只处理一个请求,直到再次调用BegingGetContext。因此,它自然受到限制(仅限于一个连接)。如果您调用它两次,它将处理两次,以此类推。虽然连接尝试可以“排队”,但它们一次只能处理一个。

票数 1
EN

Stack Overflow用户

发布于 2015-10-23 04:27:16

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

“线程池+队列”方法的一个例子是Grapevine。在我的研发分支Interpspecific中,我对此进行了增强,以限制待处理请求的数量。它清除HttpListener队列,如果队列“已满”,则拒绝错误数为500的请求。来自RESTServer.c

代码语言:javascript
复制
    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+ ),则接受循环和连接限制将有所不同,但总体思想是相同的:立即接受HttpListenerContexts,如果您“太忙”,则返回500。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8579661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档