【问题标题】:Rationale Behind IReadOnlySessionStateIReadOnlySessionState 背后的基本原理
【发布时间】:2011-03-11 03:59:30
【问题描述】:

我刚刚实现了一个使用 IReadOnlySessionState 的处理程序,我想知道为什么需要这个标记接口。 (我知道访问 Session 变量是必需的,我的问题是为什么从框架设计者的角度来看这是)他们想利用会话状态,但我想知道我是否遗漏了其他东西。

【问题讨论】:

标签: c# asp.net session-state


【解决方案1】:

你是对的。 IReadOnlySessionState 接口只是让您可以使用 Context.Session 对象。

但如果你实现IRequiresSessionState 接口,你的处理程序会在当前会话上设置排他锁,因此同一会话上下文中的所有其他请求(想要使用 Session 对象)将等到你的处理程序完成。

IReadOnlySessionState 不是很好的名字,因为实际上你可以在这样的处理程序中修改 SessionState 并且你不会得到异常。您只需对自己的并发问题负责。

【讨论】:

  • 我认为声称如果你设置 IReadOnlySessionState,你可以进行更改(例如 Session["x"] = 3)并且这些更改会“坚持”,影响 Session["x" 的未来访问"] - 唯一的区别是避免排他锁被取出。但是我无法重现这个; IReadOnlySessionState 确实允许您在不看到异常的情况下对 Session 进行更改,但是一旦处理程序退出,这些更改似乎就被遗忘了。如果声称更改确实会坚持下去,是否有任何重现的提示?
  • 我复制了这个没有任何问题。创建asp.net项目,在Default.aspx中添加<%=Session["t"]%>
  • @Chris 我复制了这个没有任何问题。创建asp.net项目,将<%=Session["t"]%>添加到Default.aspx的标记中,设置EnableSessionState="true",将Session["t"] = ((int) (Session["t"] ?? 1) ) + 1;添加到Default.aspx.cs(在Page_Load中),启动站点并多次刷新页面。每次刷新计数器都会递增。(不知道我只能编辑评论五分钟。很烦人。)
  • 是的,EnableSessionState="true"(相当于 IRequiresSessionState 的页面标记)将按照您的描述运行。我认为您暗示如果页面具有 EnableSessionState="ReadOnly"(页面标记等效于 IReadOnlySessionState),那么它也会以这种方式运行——这是不正确的。 (使用“ReadOnly”,当您重新加载页面时,计数器不会增加。)我可能误解了您的原始帖子。我会说“使用 IReadOnlySessionState,您可以修改 SessionState 而不会出现异常 - 但您的更改不会持续到下一个 HTTP 请求。”
  • @Chris 对不起,我在评论中犯了一个错误,我的意思是设置 EnableSessionState="ReadOnly" 并且计数器将在每次刷新时递增。这意味着通过下一个 HTTP 请求更改 persist
【解决方案2】:

是的,AFAIK,你是对的。 IReadOnlySessionStateIRequiresSessionState 都是标记接口,可防止您的处理程序变得更重、更慢。

它们之间的区别只是会话的写入状态。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多