反序列化&序列化存储在Cookie中的会话数据对象

时间:2016-08-22 14:08:43

标签: c# asp.net cookies json.net

我试图将会话数据存储在cookie中。我们的想法是将对象(非常小)存储为cookie中的json字符串。我正在使用此线程中答案中找到的类示例的修改版本:

Is this technique of ASP.NET session access multi-user-safe?

这是我正在尝试的...

using System;
using Newtonsoft.Json;
using System.Web;

namespace SomeNameSpace
{
public class MySession
{
    // private constructor
    private MySession()
    {
        SomeString = string.Empty;
        MyDate = DateTime.Now;
        UserId = 0;
    }

    // Gets the current session.
    public static MySession Current
    {
        get
        {
            MySession session = null;
            if (HttpContext.Current.Request.Cookies["Session"].Value != null)
            {
                // This is where I'm having trouble.  Neither of these work:
                session = JsonConvert.DeserializeObject<MySession>(HttpContext.Current.Request.Cookies["Session"].Value);
                session = (MySession)JsonConvert.DeserializeObject(HttpContext.Current.Request.Cookies["Session"].Value);
            }

            if (session == null)
            {
                session = new MySession();
                HttpContext.Current.Response.Cookies["Session"].Value = JsonConvert.SerializeObject(session);
            }
            return session;

        }
    }

    public string SomeString { get; set; }
    public DateTime MyDate { get; set; }
    public int UserId { get; set; }
}
}

这一行:

session = JsonConvert.DeserializeObject<MySession>(HttpContext.Current.Response.Cookies["Session"].Value);

不会抛出错误。但问题是,它启动了构造函数,因此它总是返回具有默认值的对象。

这一行:

session = (MySession)JsonConvert.DeserializeObject(HttpContext.Current.Response.Cookies["Session"].Value);

引发错误:

Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'SomeNameSpace.MySession'

我该如何完成这项工作?

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在阅读关键字“会话”的响应 Cookie,该关键字从未设置过。您需要阅读请求 cookie。

话虽如此,如果这是会话数据,您不希望将其存储在用户可读和用户可编辑的cookie中。