【发布时间】:2010-11-09 00:07:28
【问题描述】:
我想存储一些变量,这些变量将在整个生命周期中被引用,从 PreInit 事件中的数据库访问开始。 ViewState 不是一个选项,因为如果在页面生命周期的早期保存它就不会持续存在。鉴于用户不应更改数据,最好的选择是什么?
【问题讨论】:
我想存储一些变量,这些变量将在整个生命周期中被引用,从 PreInit 事件中的数据库访问开始。 ViewState 不是一个选项,因为如果在页面生命周期的早期保存它就不会持续存在。鉴于用户不应更改数据,最好的选择是什么?
【问题讨论】:
您可以使用 Session 来存储您的数据。我不确定您系统的用户数量,但假设您要存储的数据很小,这不会有问题。'
此外,除非您使用 SessionPageStatePersister(或其他服务器端持久化程序)或加密您的 ViewState,否则用户仍然可以更改 ViewState。这可能更难,但仍有可能。默认情况下,ViewState 使用 HiddenFieldPageStatePersister 并将 ViewState 存储在每个页面上的隐藏字段中(作为编码字符串)。只是值得考虑的事情。
【讨论】:
【讨论】:
您可以将数据存储在隐藏字段中,如果您想隐藏它,您可以使用某种加密。当然,这些值也只会在页面生命周期的后期加载。 session 对象将是显而易见的选择,尽管它不是每个人都喜欢的方法。
【讨论】:
Session 可能在 PreInit 中不可用,但您可以将它们存储在变量中,直到稍后的页面生命周期任务,然后在那时将它们存储在 session 中。我可能对会话功能有误。此外,缓存是一种选择,但缓存不是用户特定的;您可以通过附加用户 ID 或会话 ID 使其特定于用户。
【讨论】:
Session 可能是您最好的选择。我们必须使用会话来存储一些用户信息,但是由于太早访问它而遇到了一个错误。该错误是[HttpException]: Session state has created a session id, but cannot save it because the response was already flushed by the application." 但它通常会表现为PageRequestMangerParserErrorException。超级有趣的追捕。一种骇人听闻的解决方法是在后面写入您的 Global.asax 代码:
public Session_Start(object sender, EventArgs e)
{
string sessionId = Session.SessionID;
}
访问 SessionID 会强制 ASP.NET 引擎在正常情况下构建会话,从而可以及早使用它。
在会话(或应用程序)之外,您还有另外两个选择:客户端存储和持久存储。后者是一种奇特的说法,即“将其填充到数据库中”,当然也存在类似的替代方案。
客户端存储类似于视图状态,但更受控制。您可以使用隐藏字段或 cookie。事实上,cookie 可能对您很有效,但如果您希望用户不理会它,则需要对其中的信息进行加密。无论如何,您必须假设您发送给客户的任何内容都已受到损害,因此请始终进行有效性检查。
【讨论】: