在我们的项目中,我们需要连续异步执行几个 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/