C# 从会话中保存转换为cookie?

C# 从会话中保存转换为cookie?,c#,asp.net,session,cookies,C#,Asp.net,Session,Cookies,所以,我正在开发一个演示web仪表板。以前,我一直使用会话来存储有关仪表板的设置,但我想将其移动到一种更持久的保存设置的方法 在我看来,使用饼干是我最好的选择。我并不完全肯定我有时间把一切都安排好,以便正确地向数据库中写入或从数据库中写入数据 话虽如此,我对会话和cookie之间的相似性所做的一些假设可能让我有些不知所措 目前,我有如下代码: public Dictionary<string, RadPageViewSetting> PageViewStates {

所以,我正在开发一个演示web仪表板。以前,我一直使用会话来存储有关仪表板的设置,但我想将其移动到一种更持久的保存设置的方法

在我看来,使用饼干是我最好的选择。我并不完全肯定我有时间把一切都安排好,以便正确地向数据库中写入或从数据库中写入数据

话虽如此,我对会话和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是一个类,其中包含一些我正在录制的属性

Cookie是否可以实现此功能?如果没有,我应该在哪里通过浏览器保存数据

编辑:我将使用来帮助我序列化字典,然后开始序列化我自己的自定义数据hypers 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中存储所需内容。由于Cookie是纯文本。

虽然您接受的答案在技术上可行,但我认为在web.confg的sessionState元素中设置两个属性值可能更容易

要启用Cookie,请设置mode=InProc和cookieless=UseCookies。通过这些配置更改,您不必更改代码中的任何其他内容,因为只要在客户端浏览器上启用了cookie,就可以确保会话使用cookie工作

您似乎不知道ASP.NET会话状态对象在默认情况下实际使用Cookie跨多个请求持久化数据,尽管此行为可以在web.config中更改

文档
只需修改您的属性以使用而不是会话[并确定如何序列化信息],尽管我建议使用Cookie来存储令牌并在数据库中引用该令牌以实现实际持久性,但这还取决于您存储的信息类型、受众、,等等。您还可以将cookie提供程序用作多维数组。响应.Cookies[userInfo][userName]=patrick;Response.Cookies[userInfo][lastVisit]=DateTime.Now.ToString;Response.Cookies[userInfo].Expires=DateTime.Now.AddDays1;注意:cookie对每个cookie的数据大小和cookie总数有限制。请注意,您将无法在此处存储任意大量信息。另外,不要忘记在同一个域上的每个请求都会发送大量数据,包括JS/CSS/JPG文件,除非您仔细管理cookie路径/域。哦,伙计。好的,谢谢!我不知道。我学到了很多关于使用cookies的知识,但是如果会话能够像cookies一样持久,我可能会坚持下去。如果我想看到cookies会话正在生成,我将如何做到这一点?想法是我希望能够将cookie剪切/粘贴到不同的计算机上,以复制/粘贴网页设置。-1:UseCookie不会在cookie中保留数据-它只会强制使用cookie来存储会话ID。请阅读-1:默认情况下,这些设置是,InProc将数据存储在内存中,cookie中只有会话id—因此在会话过期或应用程序池回收后,它将永远消失—另一方面,cookie可以永远保存数据