MSDN says HttpListener基于http.sys,“HTTP.sys提供连接管理,带宽限制和Web服务器日志记录”。HttpListener限制?
我需要限制连接到服务器的最大数量。用HttpListener做这件事的最好方法是什么?
MSDN says HttpListener基于http.sys,“HTTP.sys提供连接管理,带宽限制和Web服务器日志记录”。HttpListener限制?
我需要限制连接到服务器的最大数量。用HttpListener做这件事的最好方法是什么?
如果您使用HttpListener,这意味着您负责提供请求/响应处理。如果您要在应用程序中创建HttpListener的新实例,请添加一个前缀并调用Start,直到您的代码调用GetContext或BeginGetContext,您的应用程序代码才会响应传入的请求。
如果您调用BeginGetContext(异步),它将只处理一个请求,直到再次调用BegingGetContext。所以它自然是有限的(只有一个连接)。如果你调用了两次,它会处理两次,依此类推。虽然连接尝试可能“排队”,但它们只能一次处理一个。
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,如果您也是“太忙”。