asp.net - 只读 session 可写

标签 asp.net session concurrency webforms session-variables

在我们的项目中,我们需要连续异步执行几个 AJAX 调用,因此下一个调用不必等待上一个调用返回。即使客户端异步发出调用,服务器也会由于 session 锁而按顺序处理它们。

由于我们不需要在这些调用中修改 Session,因此我们通过 @Page 指令使用 EnableSessionState="ReadOnly" 标记 AJAX 调用的页面。它起作用了,调用变得真正异步,不再依赖于彼此的时间。但我们发现 - 在后端代码中,尽管 session 被标记为只读,但它是可写的。我们可以为 Session 分配值并且这些值会保留。这是错误还是设计行为?

最佳答案

我想说这种行为是进程内 session 状态的“设计”陷阱(不幸的是,这似乎没有很好的记录)。

进程外 session 状态(状态服务器或 SQL Server)

在每个请求开始时,ASP.NET 将 session 数据从外部存储加载并反序列化到内存中。每个请求都会获取自己的数据副本,因此对数据的更改不会影响同一 session 中的其他并发请求。

如果 EnableSessionState 设置为 ReadOnly,则在请求结束时,数据将被简单地丢弃,而不是序列化回外部存储。

进程内 session 状态

不发生序列化或反序列化。相反,内存中有一组 session 数据,在 session 期间一直存在。同一 session 中的每个请求都共享该数据集,并且其他并发请求立即可以看到对数据的更改。

我认为 ASP.NET 团队可以在 EnableSessionState 设置为 ReadOnly 时将 Session 设置为只读:

this.Session["Customer"] = customer; // Why not throw InvalidOperationException?

但是 ASP.NET 仍然无法检测对象本身的更改:

Customer customer = (Customer)this.Session["Customer"];
customer.Address = address; // ASP.NET can't detect this.

因此,如果您将 EnableSessionState 设置为 ReadOnly,作为开发人员,您有责任避免更改 session 数据。否则,您可能会引入多线程错误。

关于asp.net - 只读 session 可写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33697093/

相关文章:

asp.net - NHibernate:获取所有打开的 session

java - 如何处理多个连续的表单和 Java 对象

Java Web 应用程序多用户 session 处理

ios - 如何在 NSOperationQueue 上使用 NSRunLoop?

java - 等待所有阻塞队列元素取出后处理

javascript - 在 jquery 插件成功事件上操作 DOM

asp.net - 我需要对 MVC 架构和三层架构进行一些说明

JavaScript REST 客户端和 session 管理

java - ExecuterService 停止处理两个线程中的一个

asp.net - 404页面response.redirect与server.transfer