考虑用户同时发出多个请求,是否必须锁定与Session一起使用的所有代码?
例如,如果我有以下情况,在浏览器的一个标签中,用户打开一个页面,在第二个标签中,他会退出。
请求1:
if(Session["user"] != null)
lblName.Text = Session["user"].Name;
请求2:
if(logout)
Session["user"] = null;
在访问Name属性时,Request 1是否可能抛出NullPointerException?我是否需要锁定请求1中的代码,以确保用户在检查null后仍然存在?或者ASP.NET是否以某种方式自动处理?
答案 0 :(得分:14)
对于同一会话的ASP.NET应用程序的两个请求,其中处理程序不使用IReadOnlySessionState
标记接口或为您的页面打开EnableSessionState="ReadOnly"
,将被序列化ASP.NET运行时保证状态的一致性。因此,如果您有两个能够写入会话状态的页面,无论客户端做什么,它们都将被串行访问。
您的应用程序代码可以通过上述技术向ASP.NET发送信号,无论页面/处理程序是否要写入会话状态。如果不这样做,所有请求都将被序列化,并且Web应用程序的性能将受到影响。
答案 1 :(得分:9)
与往常一样,答案取决于“安全”的含义。在ASP .NET中,每个请求都可以独占访问其会话状态。这意味着您不必担心在单个请求的范围内同步访问。如果Session [“user”]为非null,则在当前请求的整个持续时间内它将为非null。在您的示例中,请求1将永远不会抛出空引用异常。
答案 2 :(得分:4)
在ASP.NET中,Session module uses a pair of reader/writer locks per session,因此请求1将具有一致的读取,并且请求2将阻塞,直到请求1完成。
答案 3 :(得分:1)
是的,Session是线程安全的。
无需锁定任何内容。但是,检查值的必要性永远不会是必不可少的。
<强>更新强>
检查@Peter Ruderman的回答:)
我将不得不复制它:)