我有一个(遗留的)ASP .NET WebForms项目,我希望尽可能将EnableSessionState设置为ReadOnly,以防止会话锁被单个用户阻止并发页面加载。
在某些页面上,我确实想写入会话状态。
通常情况下,只需将EnableSessionState设置为True,仅适用于需要写入会话的页面。
问题是Page_Load事件只需要从会话状态读取,并且页面上唯一需要写入会话状态的代码是按钮Click事件。
但是EnableSessionState适用于整个页面 - 所以如果我将它设置回True,整个页面都会受到影响,即使它真的只需要在一个特定的事件处理程序中写入会话。
最大的问题是需要写入会话的代码是在站点范围的母版页中的事件处理程序中(它允许用户轻松地在链接的帐户之间切换),所以我真的不能在任何页面上都将EnableSessionState设置为ReadOnly!
所以这就是问题:是否可以在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,示例代码也可能会运行,但会话实际上并未持久...如果您重新加载页面,则会话的写入将不会在页面加载中持续存在。)
我找不到任何改变事件处理程序中的会话模式的方法......
我想也许我可以创建一个新的上下文实例或会话实例或类似会话读/写的东西,但我找不到办法让它工作。