我想创建充当HTTP侦听器的Windows服务,并且可以处理大约500个客户端。这种服务是否有任何特殊考虑因素。
我在HTTPListener类和TCPListener类之间有点混淆。哪一个用于Windows服务:
这就是我正在做的启动监听器。
listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();
listener.BeginGetContext(new AsyncCallback(OnRequestReceive), listener);
private void OnRequestReceive(IAsyncResult result)
{
HttpListener listener = (HttpListener)result.AsyncState;
// Call EndGetContext to complete the asynchronous operation.
HttpListenerContext context = listener.EndGetContext(result);
HttpListenerRequest request = context.Request;
}
我能同时处理N个客户吗?
答案 0 :(得分:1)
如果您需要能够高度响应HttpListener
,则无法很好地扩展(您一次不能接受多个连接)。但是对于小规模使用,小心获取上下文并异步编写响应它可以工作。
编辑:似乎我误解了HttpListener
接受连接的能力。您可以同时接受多个连接(请参阅注释)。然而,IIS的其他主机代码设施将避免重新发明轮子。因此,除非有非常具体的要求排除IIS,为什么不采取简单的方法呢?
为了认真使用,请使用IIS,创建一个Http Handler(一个实现IHttpHandler或IHttpHandlerFactory,甚至是IHttpAsyncHandler的类)来处理请求(这是实现.aspx等的基础类型)。
正确的解决方案实际上取决于“处理大约500个客户”的含义:一次一个或一次一个?
基于评论答案:500,同时注意到步骤3中的处理包括另一个HTTP调用,我怀疑使用HttpListner将能够处理负载而不确保每个操作都是异步的(获取上下文和请求) ,执行转发HTTP请求,然后发送响应)...这将导致更难编码。
除非有充分理由避免使用IIS,否则使用IIS会更容易,因为它旨在支持具有丰富功能的大规模客户端请求加载,而HttpListener“提供一个简单的,以编程方式控制的HTTP协议侦听器。”。< / p>
编辑:根据更多负载细节进行扩展。
答案 1 :(得分:0)
我会使用HttpListener
课程。它为你做了许多事情,你不需要重新发明轮子。它还与Windows Server 2003中的内核模式http.sys
驱动程序集成,并且应该提供更好的性能。
答案 2 :(得分:0)
我创建了一个TcpListener并使用BeginAcceptTcpClient方法启动了侦听器。每个传入请求都被带到一个单独的线程进行处理,其中连续使用客户端连接来从客户端获取/发送数据。 它似乎对大量客户来说很好。
答案 3 :(得分:0)
BeginGetContext只接受一个请求。每次收到请求时都需要重复异步调用,以便您继续执行多个请求。
有些人通过在循环中同步等待(即使用同步GetContext)的侦听器线程来简化其设计。这不是一个很好的设计,因为你最终有一个线程坐在那里等待(浪费系统资源),但如果你不是关于性能/概念验证实现的宗教信仰,这可能是可以接受的。
您还需要在服务关闭方法中调用listener.Close()。小心地将此与可能的异步线程处理请求同步。