【发布时间】:2011-03-06 08:41:45
【问题描述】:
所以,我正在开发一个演示网络仪表板。以前,我一直使用 Session 来存储有关仪表板的设置,但我想将其移至更持久的保存设置的方式。
在我看来,使用 cookie 是我最好的选择。我并不完全肯定我有时间解决所有问题以正确写入/写入数据库。
话虽如此,我可能对我对 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 是一个包含一些我正在记录的属性的类。
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();
}
}
【问题讨论】:
-
只需修改您的属性以使用
HttpCookie而不是 Session [并确定您将如何序列化信息](尽管我建议使用 cookie 来存储令牌并在用于实际持久性的数据库(它还取决于您存储的信息类型、受众等))
标签: c# asp.net session cookies