簡體   English   中英

從保存在會話中轉換為Cookie?

[英]Converting from saving in Session to Cookies?

因此,我正在使用演示Web儀表板。 以前,我一直使用Session來存儲有關儀表板的設置,但是我想將其移至更持久的保存設置的方式。

在我看來,使用Cookie是我最好的選擇。 我並不完全肯定我有時間解決所有問題以正確地寫入數據庫或從數據庫寫入數據。

話雖這么說,但我可能對我對Session和Cookies之間的相似性所做的一些假設不屑一顧。

目前,我有一些這樣的代碼:

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是我正在其中記錄一些屬性的類。

Cookies是否可以使用此功能? 如果不是,我應該在哪里通過瀏覽器關閉來保存數據?

編輯:我將使用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();
        }
    }

簡單使用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是純文本。

雖然您接受的答案在技術上可行,但我認為僅在web.confgsessionState元素中設置兩個屬性值可能會更容易。

要啟用cookie,請設置mode="InProc"cookieless="UseCookies" 通過這些配置更改,您無需更改代碼中的任何其他內容,因為可以確保會話使用cookie進行工作(前提是在客戶端的瀏覽器上啟用了cookie)。

您似乎沒有意識到,默認情況下, ASP.NET會話狀態對象實際上實際上使用cookie來持久存儲多個請求之間的數據(盡管可以在web.config中更改此行為)。

文獻資料

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM