c# - 用于生产中简单 Http Server 的 HttpListener

标签 c# .net multithreading httpserver

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

The I/O operation has been aborted because of either a thread exit or an application request

在 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();
    }

最佳答案

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

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

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

关于c# - 用于生产中简单 Http Server 的 HttpListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329707/

相关文章:

c - c中的多线程问题

c++ - 如何确保 std::thread 是在多核中创建的?

c# - 等到所有线程都完成了 ThreadPool 中的工作

c# - 如何在设计时将图像设置为窗口窗体中的超链接

c# - 使用 C# 填充 ComboBox

c# - 如何调试挂起的 WPF 应用程序?

c# - 使用自定义编码或添加自定义字符

c# - 使用 Entity Framework 数据库优先数据库上下文与 mvvm View 模型类

c# - 如何在 datagridview 中插入新的 datagridview 行并在数据库中(自动)更新?

C++ - 如何分块文件以进行同步/异步处理?