【问题标题】:HttpListener for simple Http Server in production用于生产中的简单 Http Server 的 HttpListener
【发布时间】:2012-02-17 14:09:16
【问题描述】:

我在 Windows 服务中使用 HttpListener 实现了一个非常简单的 C# Http Server,它等待请求并在收到请求时将它们发送到 ZMQ。它与这里的 HTTP 服务器非常相似 - Production ready, multi-threaded c# http server,只是它异步执行 RunServer 委托,然后一旦服务启动,它就会处于 HttpListener 正在侦听的连续循环中。我想我有一些大部分都可以工作的东西,但是当我停止服务器时,如果请求未完成,那么它会抛出一个错误

I/O 操作由于线程退出或 申请要求

在 Handle 方法中。我担心我也忽略了生产环境所需的其他东西。

    public XsmHttpServer(string httpAddressEndpoint)
    {                        
        _listener = new HttpListener();
        _listenerAddr = httpAddressEndpoint;
    }

    public void Start()
    {
        _listener.Start();

        Action action = RunServer;
        action.BeginInvoke(RunServerCallback, action);                        
    }


    private void RunServer()
    {
        while (_listener.IsListening)
        {
            IAsyncResult result = _listener.BeginGetContext(Handle, _listener);
            result.AsyncWaitHandle.WaitOne();
        }
    }


    private void Handle(IAsyncResult result)
    {
        HttpListener listener = (HttpListener)result.AsyncState;
        HttpListenerContext context = listener.EndGetContext(result);

        //Do work, send to ZMQ & write response back 
        _handler.Handle(context);                                         
    }

    private void RunServerCallback(IAsyncResult ar)
    {
        try
        {
            Action target = (Action)ar.AsyncState;
            target.EndInvoke(ar);
        }
        catch (Exception ex)
        {
            if (_log.IsDebugEnabled) _log.Debug("Failed to initialize Server", ex);  
        }
    }


    public void Stop()
    {
       _listener.Close();
    }

【问题讨论】:

    标签: c# .net multithreading httpserver


    【解决方案1】:

    “停止服务器”是指您在代码中调用 Stop() 方法。这是调用侦听器的 Close() 方法,这会使任何挂起的请求无法完成 (http://msdn.microsoft.com/en-us/library/system.net.httplistener.close.aspx)。

    您应该首先调用侦听器的 Stop() 方法,等到所有待处理的请求都已处理完毕,然后再 Close() 它。

    除非您的应用程序允许切断这些待处理的请求,在这种情况下,您可以接受并忽略错误,但一般来说,最好让它们完成以避免您有一半的情况- 处理了一个请求,客户端重新提交它。

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 2021-03-12
      • 2023-03-30
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 2021-02-03
      相关资源
      最近更新 更多