2

Windows / Active Directory認証を使用するASP.NET(VB)Webアプリケーションで作業しています

モジュールを使用しているので、各ページでそれらにアクセスするために新しいオブジェクトをインスタンス化する必要なしに、パブリックサブルーチンと関数、および参照変数を呼び出すことができます。

そのモジュール内には、Webアプリケーション全体の複数のページで使用しているいくつかのパブリック変数があります。最近、モジュール内のこれらのパブリック変数の値がすべてのユーザー間で共有されることに気付きました。

目標:これらのグローバル変数の値を単一のユーザーに固有にし、すべてのセッション間で共有しないようにし、変数を使用するすべてのページで新しいオブジェクト/クラスをインスタンス化する必要はありません。

キャッチ:Cookieやセッションなどのクライアント側の変数に値を格納したくありません。値をサーバーに保存したいのですが、各クライアント/ユーザーに固有です。

私が考えることができる唯一のことは、グローバルコレクション/辞書を設定し、認証されたユーザー名で変数を格納することですが、値を取得および設定するための特定の関数が必要です。これは機能しますが、アプリケーションのすべてのページでこれらの変数へのすべての参照を更新する必要があります。

問題の例:以下のコードは、モジュール内でパブリック変数を作成する方法と、あるページから値を設定して別のページで使用する方法を示しています。この変数を引き続き同じように使用して、その値をページ間で共有したいのですが、変数の値をユーザー間で共有する必要はありません。

--MODULE.VB-

Public Module MyMod  
    Public myVariable as String = ""  
End Module  

--MAINPAGE.VB-

  Partial Class _Default  
        Sub Page_Load() Handles MyBase.Load()  
           myVariable = "HELLO WORLD"  
        End Sub  
    End Class  

--NEXTPAGE.VB-

  Partial Class _Default  
        Sub Page_Load() Handles MyBase.Load()  
           Response.Write(myVariable)  
        End Sub  
    End Class  

このアプリケーションには、userIDインデックス付きコレクションソリューションを使用する必要がある場合に手動で更新する必要があるページがたくさんあるので、これらの変数を別のスコープにする方法、または共有を無効にする方法があることを望んでいます。セッション間。前もって感謝します!

4

2 に答える 2

2

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

あなたのオプションはまさにあなたが説明したものです。モジュール内のパブリック変数を、辞書内のユーザー固有のフィールドにアクセスするために作成する getter を持つプロパティに置き換えることができます (この getter コードを作成するときは、スレッド セーフに注意してください)。

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

幸運を、

于 2012-08-03T20:41:12.180 に答える
2

変数をページ ラウンド トリップ間で永続化する必要があるかどうか、または各ページのライフサイクル内でのみ使用されるかどうかを示しませんでした。

それらがページ間で永続化されていない場合、おそらく最も簡単な解決策は、すべてのページをベース ページ クラスから継承し、モジュールからベース ページに値を移動することです。この方法では、変数参照を変更する必要はなく、ページの継承のみを変更する必要があります。

値を保持したい場合は、上記の変更を完了すると、実装がはるかに簡単になります。次に、ベース ページのメンバー変数をプロパティに変換し、ゲッターとセッターにユーザー固有のキャッシュとフェッチを埋め込むことができます。

たとえば、次の代わりに:

Public MyVariable As String = ""

次のようなものがあります。

Public Property MyVariable As String
    Get 
       Return GlobalMyVariableCache(UserNameKey)
    End Get
    Set (Value As String)
       GlobalMyVariableCache(UserNameKey) = Value
    End Set
End Property
于 2012-08-03T20:44:22.600 に答える