私は、Windowsサービス内でHttpListenerを使用して非常に単純なC#Httpサーバーを実装しました。これは、要求を待機し、受信時に要求をZMQに送信します。これは、ここでのHTTPサーバーと非常によく似ています。本番環境に対応したマルチスレッドのc#httpサーバーは、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();
}