下面介绍ASP.NET中会话模块的结构:
据我所知,当应用程序使用分布式会话提供程序(例如Azure中的Redis)时,SessionStateModule会在请求开始时将用户的会话数据反序列化为Session字典。
我想知道模块是否会反序列化用户会话中的所有内容,或者只是在该请求期间访问的会话条目?假设用户的会话有3个条目A,B,C,并且在当前请求中只读取条目B,模块是否会从分布式会话中检索所有3个条目,将它们反序列化为会话字典?
如果它反序列化所有内容,用户会话中的数据越多,每个请求的速度就越慢?因为需要检索/反序列化的数据越多
答案 0 :(得分:1)
是的,会话状态假定提供者反序列化/序列化整个状态,因此存储更多数据的时间更长,以便开始/结束请求。
作为一种选择,如果您需要存储大量数据 - 在会话状态之外存储不常需要的部分,并在会话状态中保留数据位置的信息。请注意,您需要计算此类拆分状态存储的安全性和到期影响。
或者,如果您要实现自己的提供程序,则可以使用Item
方法实现自己的SessionStateStoreData
class,该方法将根据需要动态查询项目。遗憾的是,该类没有async
版本,因此远程调用获取数据将导致请求处理代码出现意外延迟,并阻止处理请求的线程。