Я реализовал действительно простой C # Http-сервер, используя HttpListener в рамках службы Windows, которая ожидает запросы и отправляет их ZMQ при получении. Здесь он очень похож на HTTP-сервер - Готовый к работе многопоточный сервер c # http , за исключением того, что он выполняет делегат RunServer асинхронно, а затем, когда служба запущена, находится в непрерывном цикле, который прослушивает HttpListener. Я думаю, что у меня есть кое-что, что работает в большинстве случаев, однако, когда я останавливаю сервер, если запросы не выполнены, он выдает ошибку
Операция ввода-вывода была прервана из-за выхода из потока или
запрос заявки
в методе 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();
}