2012-02-17 62 views
1

私は、Windowsサービス内でHttpListenerを使用して本当にシンプルなC#Httpサーバーを実装しました。要求を待ってZMQに送信します。これはHTTPサーバーと非常によく似ています - Production ready, multi-threaded c# http server RunServerデリゲートを非同期的に実行し、サービスが開始されるとHttpListenerがリスニングしている連続ループに座っています。私は、しかし、私は、サーバーを停止すると要求が傑出しているならば、それは単純なHttpサーバーのHttpListener

エラーがスローI/O操作がスレッドの終了または アプリケーションのいずれかで中止されました、私はほとんどの部分で動作する何かを持っていると思いますリクエスト

ハンドルメソッドです。私は生産環境に必要な他のものも見落としてしまうのではないかと心配しています。

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

答えて

3

「サーバーを停止する」とは、コードでStop()メソッドを呼び出すことを意味します。これにより、リスナーのClose()メソッドが呼び出され、保留中の要求は完了できません(http://msdn.microsoft.com/en-us/library/system.net.httplistener.close.aspx)。

まず、リスナーのStop()メソッドを呼び出し、保留中の要求がすべて処理されるまで待ってから、Close()を実行する必要があります。

これらの保留中のリクエストを切り捨てても問題が解決しない限り、エラーを受け入れて無視することはできますが、一般的には、リクエストを半分処理し、クライアントがリクエストを再送信します。

+0

ありがとうございます - これをコードに追加します – Nicki

関連する問題