/// <summary>
        /// 处理握手
        /// </summary>
        /// <param name="session">会话对象</param>
        /// <param name="buffer">接收到的数据</param>
        private void ProcessHandshake(T session, ReceiveBuffer buffer)
        {
            var request = default(HttpRequest);

            try
            {
                request = HttpRequest.Parse(buffer, this.LocalEndPoint, session.RemoteEndPoint);
            }
            catch (Exception)
            {
                session.Close();
                return;
            }

            // http请求的数据未完整
            if (request == null)
            {
                return;
            }

            if (this.OnHandshake(session, request) == false)
            {
                session.Close();
                return;
            }

            // 握手成功
            try
            {
                var response = new HandshakeResponse(request);
                session.SendResponse(response);
            }
            catch (Exception)
            {
            }
            finally
            {
                session.TagData.Set("HANDSHAKED", true);
            }
        }
        /// <summary>
        /// 收到WebSocket的握手请求
        /// </summary>
        /// <param name="context">上下文</param>
        /// <returns></returns>
        private Task OnWebSocketHandshakeRequest(IContenxt context)
        {
            try
            {
                var httpRequest = default(HttpRequest);
                if (HttpRequest.Parse(context, out httpRequest) == false)
                {
                    return(this.Next.Invoke(context));
                }

                if (httpRequest == null || httpRequest.IsWebsocketRequest() == false)
                {
                    return(this.Next.Invoke(context));
                }

                const string seckey   = "Sec-WebSocket-Key";
                var          secValue = httpRequest.Headers[seckey];
                return(this.ResponseHandshake(context, secValue));
            }
            catch (Exception)
            {
                return(this.Next.Invoke(context));
            }
        }