1

私は、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();
    }
4

1 に答える 1

3

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

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

アプリケーションで保留中のリクエストを切り落とすことができる場合を除いて、エラーを受け入れて無視することもできますが、一般的には、半分処理した状況を回避するために、リクエストを終了させるのが最善です。リクエストすると、クライアントはそれを再送信します。

于 2012-02-20T16:12:15.887 に答える