我想创建充当 HTTP 侦听器并可以处理大约 500 个客户端的 Windows 服务。这种服务有什么特别的考虑吗?
我对 HTTPListener 类和 TCPListener 类有点困惑。将哪一个用于 Windows 服务将:
- 接受客户端连接(500左右)
- 处理客户请求
- 调用另一个基于 Http 的服务
- 返回一些值给调用客户端
这就是我正在做的启动监听器的事情。
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 个客户吗?
如果您需要能够高度响应HttpListener http://msdn.microsoft.com/library/system.net.httplistener不会很好地扩展(您不能一次接受多个连接)。但对于小规模使用,小心获取上下文并异步写入响应是可以的。
编辑:看来我误解了HttpListener
接受连接的能力。您可以同时接受多个连接(请参阅评论)。然而,IIS 的其他托管代码功能将避免重新发明轮子。因此,除非有非常具体的要求排除 IIS,否则为什么不采取简单的方法呢?
对于严重使用,请使用 IIS,创建一个 Http Handler(实现 IHttpHandler 或 IHttpHandlerFactory 的类,甚至 IHttpAsyncHandler)来处理请求(这是实现 .aspx 等的基础类型)。
正确的解决方案实际上取决于“处理大约 500 个客户”的含义:一次一个还是一次全部?
根据评论答案:一次 500,并注意到步骤 3 中的处理包括另一个 HTTP 调用,我怀疑使用 HttpListner 是否能够在不确保每个操作都是异步的情况下处理负载(获取上下文和请求、执行向前的 HTTP 请求,然后发送响应)...这将导致一些更困难的编码。
除非有充分的理由避免使用 IIS,否则使用 IIS 会更容易,因为它旨在支持具有丰富功能的大规模客户端请求负载,而 HttpListener“提供简单的、以编程方式控制的 HTTP 协议侦听器”。
编辑:根据负载的更多详细信息进行扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)