Pergunta

Eu tenho o seguinte código que reutiliza um CookieContainer que estabelece conexão com o primeiro pedido, mas só usa o contêiner de cookie para pedidos depois.

Depois de um período de tempo se inactivo o site vai dar um tempo limite de sessão, vou precisar para realizar o login novamente.

Q: Can I determinar (com o objeto recipiente cookie) se o tempo limite que aconteceu ou é melhor para determinar se ele tem acontecido desde o HttpWebResponse que passa a contém texto como 'tempo limite da sessão'. Qual é a melhor maneira de fazer isso?

        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;
        }
    }

E, em seguida, este método chama para o recipiente:

        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
        }
Foi útil?

Solução

Bem, já que o tempo de espera é de 30 minutos, que eu pus o login para repetir após 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 uma precaução extra, eu verifico o HttpResponse para o texto que retorna quando a sessão página a sair (embora o seu agora esperava por isso não será visto). Se isso acontecer eu definir a data lastLoggedIn como nulo e executar o método de busca novamente.

Outras dicas

Você pode extrair todos os cookies para um domínio usando o método CookieContainer.GetCookies (String URI). Usando este CookieCollection você pode obter o cookie que você está interessado e verificar a sua propriedade Expirado para ver se ele expirou.

Há uma coisa que você deve observar: Sua sessão pode terminar mesmo que o cookie é válido. IIS pode reiniciar o domínio de aplicativo do aplicativo da Web é executado e, nesse caso, todos os usuários autenticados podem perder seus dados da sessão. Assim, verificando o cookie, geralmente não é suficiente para garantir que você permanecer ligado.

Eu não tenho certeza do que você quer alcançar, mas você deve perceber que CookieContainer tem um bug no .Add (Cookie) e .GetCookies (URI) método.

Veja os detalhes e correção aqui:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top