在Web应用程序中存储自定义对象

时间:2012-06-14 12:46:09

标签: asp.net .net vb.net session caching

我是一家新公司,我正在构建一个Web应用程序向导(.Net / 4.0)。在向导过程中,用户会转到几个单独的屏幕,并且必须在完成向导之前返回到原始屏幕。这与他们通常的做法不同。但这就是它如何完成。

一种选择是将每个面板的结果存储在DB的主屏幕中。那么,当用户离开&重定向回来。我可以检查一个查询字符串然后调用一个datareader并适当地填充原始值。

我选择的选项: 我创建了一个对象,我将用户输入的结果存储到其中。当用户离开&重定向回来,通过查询字符串检查并通过BO填充控制值。

我将对象存储在HttpContext.Current.Session.Item("BO")并调用它。

我的问题是,这是一种不好的方式吗? 如果不是我想要做什么,以确保无论用户何时退出向导,都会从会话中删除该对象。 如果不好你会做什么?我不怕建设性的批评,我是新人。

2 个答案:

答案 0 :(得分:2)

我使用Session对象完成了类似的操作。至于性能(序列化)和类似的事情,我将不得不根据具体情况说,如果您的自定义类很大并包含多个其他自定义类,那么序列化可能会有所帮助,但如果它们相对较小并且仅包含原始数据类型然后序列化可能会被过度杀死并且很快会变得适得其反。

至于控制对象在会话中保留多长时间,您已经说过,为了完成向导,他们必须返回到起始页面或控制器页面或者您想要调用它的任何内容。所以我认为当他们点击“保存”或“完成”时,您可以在保存功能的末尾添加一行,如Session("BO") = nothing(或Session.Remove("BO")将完成同样的事情),这将释放来自Session容器的对象。如果您想在完成向导之前离开页面时清除会话,那么可能会更加麻烦。至于丢失的连接和超时以及类似的事情,我的理解是浏览器会将这两种情况视为会话被放弃,因此下次用户打开您的页面时,这将是一个全新的会话。

但不要担心我过去所做的就是确保每次向导启动它都会清除我计划使用的Session成员,如果它还没有{{1}然后用一个新对象重新创建它。

nothing方法或Session方法的唯一问题是两者都不是特别安全,因此如果您处理敏感数据,您可能需要加密存储在{{1}中的值}}。

当我第一次开始使用Cacheing和Session对象时,这篇文章帮助了我。 Cache Management in ASP.NET

答案 1 :(得分:1)

如果向导全部在同一页面上,只需回发以进入向导的每个屏幕,您可以使用viewstate来实现此目的。这可以解决您提出的问题,即使用户离开向导,也可能使对象保持在会话中。

请参阅有关viewstate的msdn上的以下文章: ASP.NET View State Overview

  

您还可以使用视图状态来存储特定的应用程序数据   到一页。

虽然使用viewstate有一些注意事项。您不希望将极大量的数据传输到用户浏览器以进行状态管理。存储在viewstate中的类也必须是可序列化的。引用msdn文章:

  

将视图状态信息序列化为XML,然后进行编码   使用base-64编码,可以生成大量数据。什么时候   页面发布到服务器,发送视图状态的内容   作为页面回发信息的一部分。如果视图状态包含a   大量的信息,它可以影响页面的性能。   使用典型数据测试页面的性能   用于确定视图状态大小是否正在导致的应用程序   性能问题。

  

...必须使用Serializable属性编译类,以便它的类   可以为视图状态序列化值。

有关使用viewstate的替代方法,请参阅msdn上的以下内容: ASP.NET State Management Recommendations