/// <summary>
        ///		Añade una sesión
        /// </summary>
        private async Task AddSessionAsync(SessionEventArgs e)
        {
            var session     = new WebSession.Session(e.Id);
            var webRequest  = e.WebSession.Request;
            var webResponse = e.WebSession.Response;

            // Asigna los datos a la sesión
            session.IsTunnelConnect = e is TunnelConnectSessionEventArgs;
            // Asigna los datos recibidos y enviados
            if (session.IsTunnelConnect || e.WebSession.Request.UpgradeToWebSocket)
            {
                e.DataReceived += (sender, args) => session.ReceivedDataCount += args.Count;
                e.DataSent     += (sender, args) => session.SentDataCount += args.Count;
            }
            // Actualiza los datos de sesión
            await UpdateSessionDataAsync(session, e, true);
        }
        /// <summary>
        ///		Consolida los datos de la sesión
        /// </summary>
        private async Task UpdateSessionDataAsync(WebSession.Session session, SessionEventArgs e, bool isNew)
        {
            var webRequest  = e.WebSession.Request;
            var webResponse = e.WebSession.Response;

            // Código de estado, protocolo, proceso...
            session.StatusCode = webResponse?.StatusCode ?? 0;
            session.Uri        = webRequest.RequestUri;
            session.ProcessId  = e.WebSession.ProcessId.Value;
            // Tamaño del cuerpo
            session.BodySize = -1;
            if (!session.IsTunnelConnect && webResponse != null)
            {
                if (webResponse.ContentLength != -1)
                {
                    session.BodySize = webResponse.ContentLength;
                }
                else if (webResponse.IsBodyRead && webResponse.Body != null)
                {
                    session.BodySize = webResponse.Body.Length;
                }
            }
            // Obtiene los detalles de la solicitud y la respuesta
            session.Request  = ReadRequestData(webRequest);
            session.Response = ReadResponseData(webResponse);
            // Trata la sesión nueva o modificada
            await Dispatcher.InvokeAsync(() =>
            {
                if (isNew)
                {
                    // Añade la sesión al diccionario
                    _sessions.Add(e.WebSession, session);
                    // Lanza el evento
                    SessionAdded?.Invoke(this, new NewSessionEventArgs(session));
                }
                else
                {
                    // Lanza el evento
                    SessionUpdated?.Invoke(this, new UpdateSessionEventArgs(session));
                    // Elimina la sesión del diccionario
                    _sessions.Remove(e.WebSession);
                }
            });
        }