Nancyfx 会话无法反序列化标记为可序列化的类



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

[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 对象。

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

登录模块验证用户,然后填充会话:

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;

在后续模块中,会话对象为空。 当我从会话中删除 nvp 对象时,反序列化会正确发生,并且我取回了我的值。 任何见解都会有所帮助。

不要在会话中存储用户 ID。

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

cookie 对象序列化程序的默认实现是 Mono 的二进制序列化程序。猜测,我会假设对象的序列化会创建一个太大的 cookie。因此,也许该cookie自无效以来未创建。

有什么理由不能在不将其存储在会话中的情况下执行此操作。这些数据应该能够轻松地来自数据库。如果我有一堆用户设置,我会将对象本身保留在数据库中,然后按 ID 查询。

你可以争辩说"哦,但是我需要在每个请求上点击数据库",但在我看来这不是一个有效的理由。Get by Id 的速度与数据库中的速度一样快,即使有 1 亿条记录会立即返回。


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

相关内容

最新更新