我有一个(旧的)ASP .NET WebForms 项目,并且我想尽可能将 EnableSessionState 设置为 ReadOnly,以防止会话锁阻止单个用户并发页面加载。
在某些页面上,我实际上确实想写入会话状态。
通常,只需将那些需要写入会话的页面的 EnableSessionState 设置回 True 即可。
问题是Page_Load事件只需要从会话状态中读取,而页面上唯一需要写入会话状态的代码是按钮Click事件。
但 EnableSessionState 适用于整个页面 - 因此,如果我将其设置回 True,整个页面都会受到影响,即使它实际上只需要在一个特定事件处理程序中写入会话。
最大的问题是,需要写入会话的代码位于站点范围母版页的事件处理程序中(它允许用户轻松地在链接帐户之间切换),所以我实际上无法将 EnableSessionState 设置为在任何页面上都是只读的!
那么问题来了:是否可以在 Web.config 中将 EnableSessionState 设置为 ReadOnly,然后为一个事件处理程序覆盖它?
如此有效,我想做这样的事情:
void Button_Click(object sender, EventArgs e)
{
// Change Session back to read/write mode just for this one event handler
// Not actually possible, because IsReadOnly is itself read-only
Session.IsReadOnly = false;
// Now I should be able to write to the session
Session["foo"] = "bar";
}
(请注意,即使 EnableSessionState 为 ReadOnly,示例代码也可能运行,但会话实际上并未持久保存...如果重新加载页面,对会话的写入将不会在页面加载期间持久保存。)
我找不到任何方法来更改事件处理程序内的会话模式...
我想也许我可以创建一个新的上下文实例或会话实例或类似的会话读/写的实例,但我也找不到办法让它工作。