如何在ASP中存储集合.. NET会话使用Azure Redis会话状态提供程序

本文关键字:Redis Azure 会话状态 程序 会话 ASP 存储 NET 集合 | 更新日期: 2023-09-27 18:08:58

我使用的是在Azure上配置Redis缓存的Microsoft.Web.Redis.RedisSessionStateProvider。. NET MVC 5应用程序。

我说的是在Session中存储值在控制器中定义的一些动作中。如果我存储原语值(Session["Foo"]="Bar")或原语集合,它可以正常工作:

List<int> items = new List<int>();
items.Add(5);
Session["Items"] = items;

但是如果我尝试存储我自己的类的集合,它不会持续存在(在另一个请求之后,Session["Products"]null):

List<Product> products = new List<Product>();
products.Add(db.Find(Id));
Session["Products"] = products;

Product看起来像这样:

public class Product
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int CategoryID { get; set; }
    [ForeignKey("CategoryID")]
    public Category Category { get; set; }
    public decimal Price { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}

我应该怎么做才能在会话中存储这个类的实例?

如何在ASP中存储集合.. NET会话使用Azure Redis会话状态提供程序

由于Redis是一个键值存储,您的对象需要序列化到byte[]流。试着用[Serializable]属性来修饰你的Product类。

查看MSDN。

@lort,我想你可能面临的问题是这样的。当使用Redis会话状态提供程序时,Redis中的会话字典本身就是一个哈希,其中每个会话键值对是一个哈希字段/值对,并且只能接受字符串作为值,而不是对象,如列表,据我所知。正如@haim770所指出的,您可以将列表转换为JSON或XML之类的东西,并将JSON/XML写成字符串。当您想要使用Session变量(该列表)时,请将JSON/XML字符串值转换回列表。

示例见下文。我正在使用Microsoft RedisSessionState provider Microsoft. web .Redis. redissessionstateprovider .

JavaScriptSerializer ser = new JavaScriptSerializer();
List<Product> products = new List<Product>();
products.Add(new Product{Name="test", Description="test"});
string productsField = ser.Serialize(products);
Session["Products"] = productsField;

在redis-cli窗口中,我可以看到显示的产品列表的会话值。请注意,会话字典是一个Redis哈希,每个"条目"是一个哈希字段。

redis 127.0.0.1:6379> hgetall /SessionInRedis_nnl24530afhndnchb2f3ronc_Data
1) "loginTime"
2) "'x00'x01'x00'x00'x00'xff'xff'xff'xff'x01'x00'x00'x00'x00'x00'x00'x00'x06'x01
'x00'x00'x00'x149/25/2014 7:52:03 PM'x0b"
3) "UserName"
4) "'x00'x01'x00'x00'x00'xff'xff'xff'xff'x01'x00'x00'x00'x00'x00'x00'x00'x06'x01
'x00'x00'x00'x06prasad'x0b"
5) "Products"
6) "'x00'x01'x00'x00'x00'xff'xff'xff'xff'x01'x00'x00'x00'x00'x00'x00'x00'x06'x01
'x00'x00'x00&[{'"Name'":'"test'",'"Description'":'"test'"}]'x0b"

希望这能帮助(OP或其他人),虽然这个问题很老