データ アクセス レイヤー (DAL) のメモリ内キャッシュを処理するオブジェクトがあり、それをスレッド間で永続化する必要があります。私が読んだことから、好ましい方法は httpcontext.item を次のようなコードで使用することです:
Shared Property DALList() As Dictionary(Of String, DAL)
Get
If Not Web.HttpContext.Current.Items.Contains("_DALList") Then
Web.HttpContext.Current.Items.Add("_DALList", New Dictionary(Of String, DAL))
End If
Return Web.HttpContext.Current.Items("_DALList")
End Get
Set(ByVal value As Dictionary(Of String, DAL))
If Not Web.HttpContext.Current.Items.Contains("_DALList") Then
Web.HttpContext.Current.Items.Add("_DALList", value)
Else
Web.HttpContext.Current.Items("_DALList") = value
End If
End Set
End Property
2 つの質問: これはオブジェクトをシリアル化しようとしていますか?もしそうなら、どうすればオブジェクトをそのままにして、シリアル化する代わりにメモリ内で参照することができますか? オブジェクトは内部で DB 接続とキャッシュを処理するため、オブジェクトをそのままにしておく必要があります。
[編集]
これを実行すると、ページがハングするエラーが発生します。イベント ログには 2 つの項目があります。
障害のあるアプリケーション w3wp.exe、バージョン 7.0.6001.18000、タイム スタンプ 0x47919ed8、障害モジュール kernel32.dll、バージョン 6.0.6001.18000、タイム スタンプ 0x4791ada5、例外コード 0xe053534f、障害オフセット 0x00000000002649d、プロセス ID 0x%9%0x10、アプリケーション開始時間.
と
状態サーバーは期限切れの TCP/IP 接続を閉じました。クライアントの IP アドレスは 127.0.0.1 です。期限切れの読み取り操作は、2009 年 4 月 7 日 20:44:29 に開始されました。
次に、コードを再ハッシュして、アイテムをセッション ID に対してディクショナリ オブジェクトに配置したところ、これらのエラーが発生しました。静的変数を使用すると問題なく動作しますが、ユーザーが他のユーザーのデータにアクセスするという元の問題があります (明らかにそれはオプションではありません)。
再ハッシュされたバージョンは次のとおりです: (これは最初の方法では機能しますが、この方法では機能しません)
Shared _CurrentScope As New Dictionary(Of String, DALScope)
Public Shared Property CurrentScope() As DALScope
Get
If Not _CurrentScope.ContainsKey(Web.HttpContext.Current.Session.SessionID & "_CurrentScope") Then
_CurrentScope.Add(Web.HttpContext.Current.Session.SessionID & "_CurrentScope", New DALScope)
End If
Return _CurrentScope(Web.HttpContext.Current.Session.SessionID & "_CurrentScope")
End Get
Set(ByVal value As DALScope)
If Not _CurrentScope.ContainsKey(Web.HttpContext.Current.Session.SessionID & "_Currentscope") Then
_CurrentScope.Add(Web.HttpContext.Current.Session.SessionID & "_Currentscope", value)
Else
_CurrentScope(Web.HttpContext.Current.Session.SessionID & "_Currentscope") = value
End If
End Set
End Property
[編集]
同じセッションで複数の Web リクエストがある場合のロックの良い点。httpcontext.item アプローチを使用することになり、プロパティが byref ではなく byval であることに問題があることがわかりました。参照によってオブジェクトを処理するメソッドを含めるようにコードを変更したところ、これが機能するようになりました。