如何在.NET中创建HTTP请求侦听器Windows服务

时间:2009-03-19 17:30:28

标签: http service tcp

我想创建充当HTTP侦听器的Windows服务,并且可以处理大约500个客户端。这种服务是否有任何特殊考虑因素。

我在HTTPListener类和TCPListener类之间有点混淆。哪一个用于Windows服务:

  1. 接受客户端连接(约500)
  2. 处理客户请求
  3. 调用另一个基于Http的服务
  4. 将一些值返回给调用客户端

  5. 这就是我正在做的启动监听器。

        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个客户吗?

4 个答案:

答案 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()。小心地将此与可能的异步线程处理请求同步。