我在 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/