1

我有标记为可序列化的实用程序类,我需要将其存储为会话变量。这是那个类:

[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,并且我得到一个空的 Request.Session 对象。

以下是 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 对象为空。当我从 Session 中删除 nvp 对象时,反序列化会正确进行,并且我会取回我的值。任何见解都会有所帮助。

4

1 回答 1

1

不要将 UserId 存储在会话中。

Nancy 使用 Cookie 进行会话,因此它们被发送到客户端,无论 cookie 是否加密,您都不应该向客户端发送任何敏感信息。

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

如果不将其存储在会话中,是否有任何理由无法执行此操作。这些数据应该能够很容易地来自数据库。如果我有一堆用户设置,我会将对象本身保存在数据库中,然后只通过 ID 进行查询。

您可以争辩说“哦,但是我需要在每个请求上访问数据库”,但在我看来,这不是一个正当理由。Get by Id 与在数据库中获取一样快,即使有 1 亿条记录会立即返回。


使用基本模块,您可以添加一个 pre-hook 来查询用户设置并将它们附加到一个属性,使它们可供所有模块访问。

于 2013-11-13T01:42:50.727 回答