HttpListener在TIME_WAIT中保留连接

时间:2014-03-03 22:48:12

标签: c# windows-services httplistener time-wait

我有一个简单的C#Windows服务,它应该对端口8080上的GET请求作出“OK”响应。 一切都很好,一个简单的痒......

对服务发出的每个请求都保留在TIME_WAIT中。 我错过了什么,我环顾四周,我在HTTPListeners和Windows服务上看到的大多数样本都是以类似的方式进行的吗?!

    private HttpListener _listener;

    protected override void OnStart(string[] args)
    {
        _listener = new HttpListener();
        _listener.Prefixes.Add("http://*:8080/");
        _listener.Start();
        _listener.BeginGetContext(new AsyncCallback(OnRequestReceive), _listener);
    }

    protected override void OnStop()
    {
        _listener.Stop();
    }

    private void OnRequestReceive(IAsyncResult result)
    {
        if (!_listener.IsListening)
            return;

        //Get context for a request.
        HttpListenerContext context = _listener.EndGetContext(result);
        HttpListenerRequest request = context.Request;

        //Obtain a response object.
        HttpListenerResponse response = context.Response;
        response.ContentType = "application/json";
        response.KeepAlive = false;

        //Our return message...
        string responseString = "OK";

        //Construct the response. 
        byte[] buffer = Encoding.UTF8.GetBytes(responseString);

        Stream output = response.OutputStream;
        response.ContentLength64 = buffer.Length;
        output.Write(buffer, 0, buffer.Length);

        //Close and send response
        try
        {
            output.Flush();
            output.Close();
            response.Close();
        }
        finally
        {   
            //Wait for another request
            _listener.BeginGetContext(new AsyncCallback(OnRequestReceive), _listener);
        }
    }      

编辑:修复_listener的本地声明。

1 个答案:

答案 0 :(得分:0)

感谢rene指出了正确的方向......

TIME-WAIT (服务器或客户端)表示等待足够的时间传递以确保远程TCP收到其连接终止请求的确认。 [根据RFC 793,连接可以在TIME-WAIT中保持最多4分钟,称为MSL(最大段寿命)。]

对于任何想要更改此行为的人: TIME_WAIT周期可通过修改以下表示TIME_WAIT周期的DWORD注册表设置来配置。

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\ TCPIP \参数\ TcpTimedWaitDelay的