Как определить время ожидания сеанса, используя при повторном использовании CookieContainer - PullRequest
2 голосов
/ 25 июня 2009

У меня есть следующий код, который повторно использует 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
        }

Ответы [ 3 ]

2 голосов
/ 25 июня 2009

Ну, так как время ожидания составляет 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 равной нулю и снова запускаю метод поиска.

1 голос
/ 25 июня 2009

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

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

0 голосов
/ 08 октября 2009

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

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

http://dot -net-expertise.blogspot.com / 2009/10 / cookiecontainer-домен-обработка-ошибка-fix.html

...