【问题标题】:Storing a Custom Object in a web application在 Web 应用程序中存储自定义对象
【发布时间】:2012-06-17 12:00:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我想在会话中存储是个好主意,我会那样做。重新标记这个问题,因为我觉得它主要是一个 ASP.net 问题
  • 好的,我需要先做些什么才能最好地存储。某种序列化?是自己处理的。去掉它怎么办。我希望它在向导完成后消失。但是其他事情呢,失去连接,超时等......
  • 很抱歉这么晚才回复,但我看到你选择的答案几乎总结了我想说的:)

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


【解决方案1】:

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

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

但是与其担心我过去所做的是确保每次向导启动时都会清除我计划使用的 Session 成员,如果它还不是 nothing 然后使用新对象重新创建它。

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

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

【讨论】:

  • 你知道加密存储在Session中的数据的好文章吗?
  • 在谷歌搜索时,我遇到了另一个堆栈溢出问题,如果你能深入了解这些琐碎的争论,那么那里有一些很好的信息。基本上,只要您对服务器有信心,您就不需要加密会话数据。 stackoverflow.com/questions/4027023/…
【解决方案2】:

如果向导都在同一个页面上,只是返回到向导的每个屏幕,您可以使用 viewstate 来实现这一点。这绕过了您提出的问题,即使用户离开向导,也可能使对象保持在会话中。

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

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

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

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

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

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

【讨论】:

  • 问题是他们使用的模式覆盖不是重定向到一个全新的 .aspx 页面的同一页面,如果从该向导访问该页面,我必须编写代码以重定向回来.查询字符串。我没有使用 WCF 进行此操作,并且我在家中有通过 Current 执行此操作的代码。要求。但是我们请求另一个页面,因此 current.request 没有我需要完成此操作的生命周期。
猜你喜欢
  • 2019-04-03
  • 2017-08-30
  • 2011-08-04
  • 1970-01-01
  • 2019-07-28
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多