【发布时间】: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