我必须将数千条记录的数据存储在数据表中并在回发时进行维护。哪个选项适合我的视图状态(我使用的)或会话。当我使用视图状态时,它会创建隐藏字段来存储它并减慢页面加载速度。那么在会话中存储它是否有任何开销(服务器端内存消耗和响应延迟)。请建议我解决方案
1 回答
对于大量数据,Session 效率更高。如果您可以检测到用户何时完成了特定数据块,请将 Session 变量设置为 null,以帮助减少内存开销。您不能总是这样做,但 Session 最终会过期,然后内存将被回收。降低会话超时会有所帮助,但不要将其设置得太小,您不想切断您的用户。会话需要在您的 Web.config 文件中启用。
以下是 Session 与 ViewState 的基本准则:
ViewState:ViewState 的二进制数据结构是经过 Base64 编码后放入页面的,也就是说它是原始二进制数据大小的 1.3333 倍(8/6)。为每个页面视图上传和下载此数据。因此,如果您在 ViewState 中有很多内容,它会影响页面响应时间。Base64 编码可能经过高度优化,因此不会影响性能。每个页面请求都会为 ViewState 分配然后释放空间,因此这不是长期的内存命中。由于数据在页面中,因此不会过期。
会话:在页面加载之间,会话中的所有数据都保存在 Web 服务器中。这样可以保持页面很小,它只需要携带 Session 标识符。不利的一面是,用于在 Session 中存储数据的任何内存都将保持分配状态,直到 Session 过期。我想知道会话是复制二进制数据还是只保留一个指针。与 Base64 编码一样,这可以进行高度优化,因此即使发生这种情况也不会影响性能。如果用户在页面浏览之间等待的时间过长,会话可能会过期。如果会话过期,它应该将用户返回到网页中的某个已知状态。
这里的另一个问题是,如果您在会话中存储信息,会话 ID 可能会在客户端浏览器中的多个选项卡之间共享。您必须小心如何使用存储在 Session 中的数据。确保您对此进行了测试,这样您的用户就不会得到意外的结果。
(注意:使用 ViewState 是 RESTful,Session 不是。)