0

创建基于 .Net Session 的变量时有一点问题。

我知道我可以只使用Session扩展并完成它,但我正在寻找更多在单个桌面上的多个浏览器(窗口或选项卡,对于 IE)情况。

目前,我在 Web-App 中声明了一个模块,当我打开两个单独的 IE 窗口时,它们最初会PageRouting按预期加载自定义设计,但是一旦我在两个窗口都打开的情况下进入下一步,最后一个要打开是用于应用程序其余部分的设计/逻辑。

模块.vb

Namespace classes
    Module Globals
        Public Brand As Brand
        Public Test As Test
        Public Results As Results
        Public Primary As String = "#FFFFFF"
        Public Secondary As String = "#FFFFFF"
        Public Terteruary As String = "#FFFFFF"

    End Module
End Namespace

在代码中,我将对象引用为Globals.BrandGlobals.Primary但在任何一种情况下,同一个桌面可以打开具有不同PageRouting地址的同一个网站,它假定最后打开的浏览器窗口。

Brand&Test变量在事件Session_Start中初始化Globals.asax。对这些对象的所有引用都是在使用Globals.<variable>时使用注释的显式引用。 Results在网站执行期间首次使用时初始化。

问题

  1. 我如何确保每个单独的浏览器窗口都加载了自己独特的会话缓存以供站点使用?

更新 - 2012-12-03

这样的设计怎么样?

Public Class Class1
  private _sess as HTTPSessionState
  ...
  private readonly property Session as HttpSessionState
    Get
      if _sess is nothing then
        _sess = httpcontext.current.session
      end if
      return _sess
    End Get
  end property
  ...
  public property Primary as string
    Get
      return cstr(session("primary"))
    end get
    Set(value as string)
      session("primary") = value
    end set
  end property
  ...
end class

在主/内容页面级别实例化 Class1?

更新 #2 - 2012-12-03

修改了模块,让我知道这是否是可行的会话控制设置

Module Globals
    'Dictionary Collection of type (SessionID:String, Quiz:classes.Quiz)
    Public Quizzes As Dictionary(Of String, classes.Quiz)

    Public Property Quiz(session As String) As Quiz
        Get
            Return Quizzes(session)
        End Get
        Set(value As Quiz)
            Quizzes(session) = value
        End Set
    End Property

End Module

最终表格 2012-12-10:

模块.vb

Module Globals
    'Get/Set a Quiz object into the SessionState.
    Public Property Quiz(sess As HttpSessionState) As Quiz
        Get
            Return CType(sess("quiz"), Quiz)
        End Get
        Set(value As Quiz)
            sess("quiz") = value
        End Set
    End Property

End Module

网页配置

<system.web>
...
    <sessionState mode="InProc" cookieless="UseCookies" 
                  regenerateExpiredSessionId="true" timeout="20" 
                  cookieName="ASPNET_Quiz" />
...
</system.web>

上述表单使用属性的索引器方面按预期工作。Havent 有任何用户实例问题。附带说明一下,为了使此功能有效工作,用户必须关闭所有浏览器窗口并打开一个新窗口以清除会话

4

1 回答 1

1

您遇到的问题是 Web 编程中非常常见的问题。一个模块的成员是静态的——这意味着在你的应用程序的整个 AppDomain 中有一个它们的实例。访问这些的每个用户都将获得相同的对象。

您可以将模块中的公共变量替换为您编写其 getter 以访问字典中用户特定字段的属性(在编写此 getter 代码时请记住线程安全)。

更简单的解决方案是使用 Session。会话值存储在服务器端并且是用户特定的。客户端发送的唯一内容是会话密钥,如果您使用的是 .Net 身份验证,则可能已经发送。

检查此来源:

如何让公共变量(在模块中)不在用户之间共享价值

于 2012-12-03T17:16:38.797 回答