我将实用程序类标记为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对象时,反序列化正确发生,我得到了我的值。任何见解都会有所帮助。
答案 0 :(得分:1)
不要将UserId存储在会话中。
Nancy使用Cookie进行会话,因此会将其发送给客户端,无论Cookie是否加密,都不应向客户端发送任何敏感信息。
cookie对象序列化器的默认实现是Mono的二进制序列化器。猜测一下,我会假设对象的序列化会创建一个太大的cookie。因此,可能因为无效而没有创建cookie。
如果不将它存储在会话中,你有什么理由不能这样做。这些数据应该能够轻松地来自数据库。如果我有一堆用户设置,我会将对象本身保存在数据库中,然后只按ID查询。
你可以争辩说“哦,但我需要在每次请求时点击数据库”,但在我看来,这不是一个正当理由。获取ID与数据库中的获取速度一样快,甚至可以立即返回1亿条记录。
使用基本模块,您可以添加预挂钩来查询用户设置,并将它们附加到属性,使所有模块都可以访问它们。