Как определить время ожидания сеанса, используя при повторном использовании CookieContainer

StackOverflow https://stackoverflow.com/questions/1041851

Вопрос

У меня есть следующий код, который повторно использует CookieContainer, который входит в систему при первом запросе, но просто использует контейнер cookie для запросов после.

Через некоторое время, если в режиме ожидания сайт выдаст тайм-аут сеанса, мне нужно будет выполнить вход еще раз.

В: Могу ли я определить (с помощью объекта контейнера cookie), истекло ли время ожидания, или лучше определить, произошло ли это из HttpWebResponse, который содержит текст, такой как «время ожидания сеанса». Каков наилучший способ сделать это?

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

А затем этот метод вызывает контейнер:

        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
        }
Это было полезно?

Решение

Ну, так как время ожидания составляет 30 минут, я настроил повторение входа через 25 минут.

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

В качестве дополнительной меры предосторожности я проверяю HttpResponse для текста, который возвращается, когда время сеанса страницы истекает (хотя теперь ожидается, что этого не будет видно). Если это произойдет, я устанавливаю дату lastLoggedIn в null и снова запускаю метод поиска.

Другие советы

Вы можете извлечь все файлы cookie для домена, используя метод CookieContainer.GetCookies (string uri). Используя эту CookieCollection, вы можете получить интересующий вас cookie и проверить его свойство Expired, чтобы узнать, не истек ли он.

Есть одна вещь, на которую следует обратить внимание: ваша сессия может закончиться, даже если ваш файл cookie действителен. IIS может перезапустить домен приложения, в котором запущено веб-приложение, и в этом случае все прошедшие проверку пользователи могут потерять свои данные сеанса. Поэтому проверки файла cookie, как правило, недостаточно для того, чтобы оставаться в системе.

Я не уверен, чего вы хотите достичь, но вы должны заметить, что в CookieContainer есть ошибка в методах .Add (Cookie) и .GetCookies (uri).

Смотрите подробности и исправьте здесь:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top