Сохранение сеанса при использовании HttpWebRequest

В моем проекте я использую клиент приложения С# и сервер веб-приложений tomcat6. Я написал этот фрагмент в клиенте С#:

public bool isServerOnline()
{
        Boolean ret = false;

        try
        {
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(VPMacro.MacroUploader.SERVER_URL);
            req.Method = "HEAD";
            req.KeepAlive = false;
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            if (resp.StatusCode == HttpStatusCode.OK)
            {
                // HTTP = 200 - Internet connection available, server online
                ret = true;
            }
            resp.Close();
            return ret;

        }
        catch (WebException we)
        {
            // Exception - connection not available
            Log.e("InternetUtils - isServerOnline - " + we.Status);
            return false;
        }
}

Каждый раз, когда я вызываю этот метод, я получаю новый сеанс на стороне сервера. Я полагаю, это потому, что я должен использовать файлы cookie HTTP в своем клиенте. Но я не знаю, как это сделать, вы можете мне помочь?


person CeccoCQ    schedule 08.06.2011    source источник
comment
Хороший вопрос! В прошлом перенос сеансов не давал мне спать   -  person Ivo    schedule 08.06.2011
comment
А вы решили этот вопрос?   -  person CeccoCQ    schedule 08.06.2011
comment
Тогда я воспользовался предложением Гийома.   -  person Ivo    schedule 08.06.2011
comment
Хорошо, но как я могу управлять файлом cookie с истекшим сроком действия? Это автоматически с CookieContainer?   -  person CeccoCQ    schedule 08.06.2011


Ответы (1)


Вы должны использовать CookieContainer и сохранять экземпляр между вызовами. .

private CookieContainer cookieContainer = new CookieContainer();
public bool isServerOnline()
{
        Boolean ret = false;

        try
        {
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(VPMacro.MacroUploader.SERVER_URL);
            req.CookieContainer = cookieContainer; // <= HERE
            req.Method = "HEAD";
            req.KeepAlive = false;
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            if (resp.StatusCode == HttpStatusCode.OK)
            {
                // HTTP = 200 - Internet connection available, server online
                ret = true;
            }
            resp.Close();
            return ret;

        }
        catch (WebException we)
        {
            // Exception - connection not available
            Log.e("InternetUtils - isServerOnline - " + we.Status);
            return false;
        }
}
person Guillaume    schedule 08.06.2011
comment
Спасибо, я попробую и дам вам знать, если это сработает. Но у меня вопрос: если срок действия файла cookie истек, как я могу с этим справиться? - person CeccoCQ; 08.06.2011
comment
Еще вопрос, а куки с ответа я не должен получить? - person CeccoCQ; 08.06.2011
comment
Контейнер будет заполнен, вам не нужно заботиться об ответном файле cookie. Также размер контейнера ограничен, и при достижении лимита файлы cookie с истекшим сроком действия удаляются. - person Guillaume; 08.06.2011
comment
АСП. Net mvc — это фреймворк на стороне сервера. Контейнер cookie находится на стороне клиента. Так что да, это будет работать независимо от стека на стороне сервера, если используются файлы cookie. - person Guillaume; 29.09.2015
comment
Могу ли я использовать этот метод для сохранения сеанса базовой аутентификации? Также могу ли я использовать один и тот же экземпляр контейнера cookie для нескольких разных пар имени пользователя и пароля? - person Tornike Shavishvili; 23.01.2020
comment
Базовая аутентификация @TornikeShavishvili основана на HTTP-заголовке авторизации, а не на файлах cookie. Вам придется продолжать отправлять этот заголовок при каждом запросе. Не стесняйтесь задавать вопросы, если вам нужна дополнительная помощь. - person Guillaume; 27.01.2020