Pregunta

Tengo el siguiente código que reutiliza un CookieContainer que inicia sesión en la primera solicitud, pero solo usa el contenedor de cookies para las solicitudes posteriores.

Después de un período de tiempo si está inactivo, el sitio dará un tiempo de espera de sesión, tendré que volver a iniciar sesión.

P: ¿Puedo determinar (con el objeto contenedor de cookies) si ha transcurrido el tiempo de espera o es mejor determinar si ha sucedido desde el HttpWebResponse que contiene texto como 'tiempo de espera de sesión'. ¿Cuál es la mejor manera de hacer esto?

        private static CookieContainer _cookieContainer;
    private static CookieContainer CurrentCookieContainer
    {
        get
        {
            if (_cookieContainer == null || _cookieContainer.Count == 0)
            {
                lock (_lock)
                {
                    if (_cookieContainer == null || _cookieContainer.Count == 0)
                    {
                        //_cookieContainer.GetCookies(
                        _cookieContainer = DoLogin();
                    }
                }
            }

            return _cookieContainer;
        }
        set
        {
            _cookieContainer = value;
        }
    }

Y luego este método llama al contenedor:

        public static string SomeMethod(SomeParams p)
        {
            HttpWebRequest request_thirdPartyEnquiryDetails = (HttpWebRequest)WebRequest.Create(thirdPartyEnquiryDetails);
            CookieContainer cookieContainer = CurrentCookieContainer;
            request_thirdPartyEnquiryDetails.CookieContainer = cookieContainer;
//... and it goes on to submit a search and return the response
        }
¿Fue útil?

Solución

Bueno, como el tiempo de espera es de 30 minutos, he configurado el inicio de sesión para que se repita después de 25 minutos.

private static DateTime? lastLoggedIn;

    private static CookieContainer _cookieContainer;
    private static CookieContainer CurrentCookieContainer
    {
        get
        {
            if (_cookieContainer == null || _cookieContainer.Count == 0 || !lastLoggedIn.HasValue || lastLoggedIn.Value.AddMinutes(25) < DateTime.Now)
            {
                lock (_lock)
                {
                    if (_cookieContainer == null || _cookieContainer.Count == 0 || !lastLoggedIn.HasValue || lastLoggedIn.Value.AddMinutes(25) < DateTime.Now)
                    {
                        _cookieContainer = DoLogin();
                        lastLoggedIn = DateTime.Now;
                    }                        
                }
            }

            return _cookieContainer;
        }
        set
        {
            _cookieContainer = value;
        }
    }

Como precaución adicional, verifico el HttpResponse para ver el texto que vuelve cuando finaliza la sesión de la página (aunque ahora se espera que esto no se vea). Si esto sucede, configuro la fecha lastLoggedIn en nulo y ejecuto el método de búsqueda nuevamente.

Otros consejos

Puede extraer todas las cookies para un dominio utilizando el método CookieContainer.GetCookies (string uri). Usando esta CookieCollection puede obtener la cookie que le interesa y verificar su propiedad Caducado para ver si ha expirado.

Hay una cosa que debe tener en cuenta: su sesión puede finalizar incluso si su cookie es válida. IIS puede reiniciar el dominio de la aplicación en la que se ejecuta la aplicación web y, en ese caso, todos los usuarios autenticados pueden perder sus datos de sesión. Por lo tanto, verificar la cookie generalmente no es suficiente para garantizar que permanezca conectado.

No estoy seguro de lo que quiere lograr, pero debe notar que CookieContainer tiene un error en el método .Add (Cookie) y .GetCookies (uri).

Vea los detalles y corríjalos aquí:

http: // dot -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top