【问题标题】:To prevent expiring session variables in submit page, should I assign session variable to viewstate variable?为了防止提交页面中的会话变量过期,我应该将会话变量分配给 viewstate 变量吗?
【发布时间】:2013-07-01 20:55:03
【问题描述】:

我有一个会话变量,用于存储数据表(根据用户希望添加/删除项目(数据表中的数据项)的方式而变化。

在整个 web 应用程序的最后一页,我有一个提交页面,允许用户提交数据表中选择的项目。

因为我认为如果页面打开时间过长会话变量可能会过期,并且为了防止过期变量引起错误,在 page_load 函数的 !IsPostBack 我将会话变量分配给 viewstate 变量(因此数据将被存储处于页面的视图状态并且不会过期)。

if(!IsPostBack){ ViewState["myDataTable"] = Session["myDataTable"]}

1) 这是标准做法吗?在将会话变量分配给视图状态时是否有任何影响/错误?

2) 拨打ViewState["myDataTable"] = Session["myDataTable"] 后,可以拨打Session["myDataTable"] = null 吗?

【问题讨论】:

  • 使用Profile 而不是Session
  • 在回发时检查会话变量是否不为空,以防止过期会话出现任何错误,怎么样?
  • @Jonny 我也是这么想的。但是如果我们希望它对用户更加友好,并且不希望用户再次输入数据,你有什么建议呢?

标签: c# asp.net


【解决方案1】:

这实际上取决于您拥有的数据的种类和大小。

重要的是要记住,您需要将发送给客户端的任何内容都视为受损数据。换一种说法,如果用户可以使用允许他们输入该数据的每一位的表单,那么您就可以了。

总而言之,视图状态通常是签名的,但 history as proven 是遵循一般安全建议的好主意。

至于大小,您需要关注每个请求所交换的数据量。

最后关于清除该会话值之后,asp.net mvc 对其所谓的 TempData 执行类似操作。其使用场景:在非发布场景 + 以及当您不希望在查询字符串中使用时,将一些数据从一页传递到下一页。

【讨论】:

  • 如果数据的大小变得太大,将数据存储在服务器上的文件中是一个好主意(并在用户想要将数据加载到页面时读取它)
  • 这在很大程度上取决于您的环境特征。假设它是单个 Web 服务器,如果您担心命中,这绝对是避免命中数据库的好方法。请注意,像@peer 建议的缓存也是一种选择,但如果您有很多并发用户在做这样的事情,您需要注意高内存使用,并且对于非常长期的场景(您会看到应用域回收)。
  • 还要考虑数据是否需要那么大,即如果对于部分数据,您只需要保留一些 id,而不是所有细节。
【解决方案2】:

是的,你可以做到。但是由于额外的开销,视图状态往往会减慢页面加载速度。如果您的数据集很小,那没关系,但如果它更大,请寻找其他替代方案。

我如何建议不要使用这种方法[安全问题,速度慢等],而是设置一种方法,以便在任何页面打开时会话都不会过期?如何??使用 jquery/ajax 定期维护与服务器的连接。

如果你想进一步实现 sql session。这将是最好的。

希望这些信息对您有所帮助。

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多