Преобразование из сохранения в сеансе в куки? - PullRequest
1 голос
/ 06 марта 2011

Итак, я работаю над демо-веб-панелью.Ранее я использовал Session для хранения настроек панели управления, но я хотел бы перевести ее на более постоянный способ сохранения настроек.

Мне кажется, что использование файлов cookie было бы моим лучшим выбором.Я не совсем уверен, что у меня есть время, чтобы все уладить и записать в / из базы данных должным образом.

При этом я могу быть не согласен с некоторыми предположениями о сходстве междуСессия и печенье.

В настоящее время у меня есть такой код:

public Dictionary<string, RadPageViewSetting> PageViewStates
    {
        get
        {
            Dictionary<string, RadPageViewSetting> _pageViewStates = (Dictionary<string, RadPageViewSetting>)Session["PageViewStates"];
            if (object.Equals(_pageViewStates, null))
            {
                _pageViewStates = new Dictionary<string, RadPageViewSetting>();
                Session["PageViewStates"] = _pageViewStates;
            }

            return _pageViewStates;
        }
        set
        {
            Session["PageViewStates"] = value;
        }
    }

, где RadPageViewSetting - это класс с некоторыми свойствами, которые я записываю.

Возможна ли эта функция спеченье?Если нет, то где мне искать, чтобы сохранить мои данные при закрытии браузера?

РЕДАКТИРОВАТЬ: я собираюсь использовать http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx, чтобы помочь мне сериализовать словарь, а затем приступить к сериализации моего собственного пользовательскогогиперссылки на данные (RadPageViewSetting).

РЕДАКТИРОВАТЬ: Вот мое непроверенное решение.Может ли кто-нибудь взглянуть на это очень быстро и дать мне знать, если он выглядит неправильно?

        public SerializableDictionary<string, RadPageViewSetting> PageViewStates
    {
        get
        {
            SerializableDictionary<string, RadPageViewSetting> _pageViewStates = new SerializableDictionary<string,RadPageViewSetting>();
            HttpCookie cookie = HttpContext.Current.Response.Cookies["PageViewStates"]; //If the named cookie does not exist, this method creates a new cookie with that name.

            if (object.Equals(cookie, null))
            {
                cookie = new HttpCookie("PageViewStates");
                cookie.Expires = DateTime.Now.AddYears(100);
                cookie.Value = null;
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
            else if( cookie.Value != null )
            {
                MemoryStream stream = new MemoryStream();
                StreamWriter writer = new StreamWriter(stream);
                writer.Write(cookie.Value);
                XmlSerializer serializer = new XmlSerializer(_pageViewStates.GetType());
                _pageViewStates = serializer.Deserialize(stream) as SerializableDictionary<string, RadPageViewSetting>;
                HttpContext.Current.Response.Cookies.Set(cookie);
            }

            return _pageViewStates;
        }
        set
        {
            XmlSerializer serializer = new XmlSerializer(value.GetType());
            MemoryStream stream = new MemoryStream();
            serializer.Serialize(stream, value);
            StreamReader reader = new StreamReader(stream);
            HttpContext.Current.Response.Cookies["PageViewStates"].Value = reader.ReadToEnd();
        }
    }

Ответы [ 2 ]

1 голос
/ 06 марта 2011

Простое использование Response.Cookies вместо Session.

По сути, в двух словах от MSDN




Response.Cookies["userName"].Value = "patrick";
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("lastVisit");
aCookie.Value = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

Вы сможете хранить все, что захотите, в файле cookie, пока выможет сериализовать его в строку.В качестве файлов cookie используется простой текст.

0 голосов
/ 06 марта 2011

Хотя технический ответ, который вы приняли, работает, я думаю, может быть проще просто установить два значения атрибута в элементе sessionState вашего web.confg.

Чтобы включить файлы cookie, установите mode="InProc" и cookieless="UseCookies".С этими изменениями конфигурации вам больше не придется ничего менять в своем коде, потому что сеанс будет гарантированно работать с использованием файлов cookie (при условии, что файлы cookie включены в браузере клиента).

Вы, похоже, не знаете, что объект ASP.NET Session State на самом деле использует куки по умолчанию для сохранения данных в нескольких запросах (хотя это поведение можно изменить в вашем файле web.config)..

Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...