0

.Netセッションベースの変数の作成にわずかな問題があります。

私はSession拡張機能を使用してそれで済ますことができることを知っていますが、単一のデスクトップでの複数のブラウザー(IEの場合はウィンドウまたはタブ)の状況をもっと探しています。

現在、Webアプリでモジュールが宣言されています。IEの2つの個別のウィンドウをPageRouting開くと、期待どおりに最初にカスタムデザインが読み込まれますが、両方のウィンドウを開いた状態で次の手順に進むと、最後のウィンドウが開きます。アプリケーションの残りの部分で使用される設計/ロジックです。

Module.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.Brandまたはとして参照しますGlobals.Primaryが、同じデスクトップが異なるアドレスで同じWebサイトを開く可能性がある状況でPageRoutingは、最後に開いたブラウザウィンドウを想定しています。

BrandTest変数は、のイベントで初期化され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:

Module.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

Web.config

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

上記のフォームは、プロパティのインデクサーの側面を利用して期待どおりに機能しました。Haventにはユーザーインスタンスの問題がありました。これが効果的に機能するためには、ユーザーはすべてのブラウザウィンドウを閉じ、セッションをクリアするために新しいウィンドウを開く必要があることに注意してください。

4

1 に答える 1

1

あなたが遭遇している問題は、Webプログラミングで非常に一般的な問題です。モジュールのメンバーは静的です。つまり、アプリケーションのAppDomain全体に1つのインスタンスがあります。これらにアクセスするすべてのユーザーは、同じオブジェクトを取得します。

モジュール内のパブリック変数を、辞書のユーザー固有のフィールドにアクセスするためにゲッターを作成するプロパティに置き換えることができます(このゲッターコードを作成するときは、スレッドセーフを覚えておいてください)。

はるかに簡単な解決策は、セッションを使用することです。セッション値はサーバー側に保存され、ユーザー固有です。クライアント側に送信されるのはセッションキーだけです。.Net認証を使用している場合、これはすでに送信されている可能性があります。

このソースを確認してください:

ユーザー間で値を共有しないように(モジュール内の)パブリック変数を取得する方法

于 2012-12-03T17:16:38.797 に答える