Nancyfx Session不能反序列化标记为Serializable的类

时间:2013-11-12 16:18:16

标签: session serialization nancy

我将实用程序类标记为Serializable,我需要将其存储为会话变量。这是班级:

[Serializable]
    public class NameValuePair<TName, TValue>
    {
        public TName Name { get; set; }
        public TValue Value { get; set; }

        public NameValuePair(TName name, TValue value)
        {
            Name = name;
            Value = value;
        }

        public NameValuePair() { }
    }    

我的NancyModule类无法正确反序列化cookie,并且我获得了一个null Request.Session对象。

以下是会话填充方式的进展:

LoginModule验证用户,然后填充会话:

Request.Session["UserId"] = user.Id;
Request.Session["TimeZoneId"] = user.TimeZoneId;
Request.Session["StandardStartTime"] = user.StandardStartTime;
Request.Session["StandardEndTime"] = user.StandardEndTime;

var nvp = new NameValuePair<string, int>() { Name = "Davie", Value = 777};
Request.Session["NVP"] = nvp;

在后续模块中,Session对象为null。当我从Session中删除nvp对象时,反序列化正确发生,我得到了我的值。任何见解都会有所帮助。

1 个答案:

答案 0 :(得分:1)

不要将UserId存储在会话中。

Nancy使用Cookie进行会话,因此会将其发送给客户端,无论Cookie是否加密,都不应向客户端发送任何敏感信息。

cookie对象序列化器的默认实现是Mono的二进制序列化器。猜测一下,我会假设对象的序列化会创建一个太大的cookie。因此,可能因为无效而没有创建cookie。

如果不将它存储在会话中,你有什么理由不能这样做。这些数据应该能够轻松地来自数据库。如果我有一堆用户设置,我会将对象本身保存在数据库中,然后只按ID查询。

你可以争辩说“哦,但我需要在每次请求时点击数据库”,但在我看来,这不是一个正当理由。获取ID与数据库中的获取速度一样快,甚至可以立即返回1亿条记录。


使用基本模块,您可以添加预挂钩来查询用户设置,并将它们附加到属性,使所有模块都可以访问它们。