我一直在尝试使用我的工作站上的HTTP.sys / HttpListener进行一些测试,似乎有一些限制可以防止超过1000个并发连接。有没有人有这方面的更多信息? (因为1k似乎有点干净而不是巧合)。
我试图找到任何线程/配置/注册表设置但是空了。
提前致谢。
GJ
看起来我跳了一下枪。
我似乎错过了使用http.sys / HttpListener BeginGetContext对并发连接不是很好,因为新的BeginGetContext只会在先前请求的响应流关闭后才会触发。
因此积压了1000个请求,在这种情况下,积压工作正在填补。
无论如何 - 如果有人有任何评论(或可能的更正),请随意扩展。
谢谢你 GJ
答案 0 :(得分:5)
我这样做的方法是让一个线程使用阻塞HttpListener
方法监听GetContext()
但是一旦收到请求就将其传递给另一个线程使用IAsyncResult
模式进行异步调用,这似乎工作正常。
private void Run()
{
while (true)
{
if (this._disposed || this._shouldTerminate) return;
if (this._listener.IsListening)
{
try
{
HttpListenerContext context = this._listener.GetContext();
//Hand it off to be processed asynchronously
this._delegate.BeginInvoke(context, new AsyncCallback(this.EndRequest), null);
}
catch (Exception ex)
{
this.LogErrors(ex);
}
}
}
}
private delegate HttpServerContext HandleRequestDelegate(HttpListenerContext context);
private HttpServerContext HandleRequest(HttpListenerContext context)
{
IHttpListenerHandler handler;
HttpServerContext serverContext = new HttpServerContext(this, context);
try
{
bool skipHandling = this.ApplyPreRequestModules(serverContext);
if (!skipHandling)
{
handler = this._handlers.GetHandler(serverContext);
handler.ProcessRequest(serverContext);
}
}
catch (NoHandlerException noHandlerEx)
{
this.LogErrors(noHandlerEx);
context.Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed;
}
catch (HttpServerException serverEx)
{
this.LogErrors(serverEx);
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
}
return serverContext;
}
private void EndRequest(IAsyncResult result)
{
try
{
HttpServerContext context = this._delegate.EndInvoke(result);
this.ApplyPreResponseModules(context);
context.Response.Close();
}
catch (Exception ex)
{
this.LogErrors(ex);
}
}
答案 1 :(得分:0)
这是一种使用HttpListener支持多个并发请求的简单方法。
for (int i = 0; i < 50; i++) {
_listener.BeginGetContext(GetContextCallback, null);
}
现在,您可以接收50个并发请求。必须承认,我从未尝试过创造1000!