我有一个对象来处理我的数据访问层(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
两个问题:这是否尝试序列化对象,如果是这样,我如何让它保持对象完好无损并在内存中引用它而不是序列化它?我需要保持对象完整,因为它处理数据库连接和缓存。
[编辑]
当我运行此操作时,我收到导致页面挂起的错误。事件日志中有两个项目。
错误应用程序w3wp.exe,版本7.0.6001.18000,时间戳0x47919ed8,错误模块kernel32.dll,版本6.0.6001.18000,时间戳0x4791ada5,异常代码0xe053534f,错误偏移0x000000000002649d,进程ID 0x%9,应用程序启动时间0X%10
和
状态服务器已关闭过期的TCP / IP连接。客户端的IP地址为127.0.0.1。过期的Read操作于2009年7月4日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
[编辑]
关于在同一会话下不止一个webrequest的情况下锁定的好点。我最终使用httpcontext.item方法,发现我的问题与属性有关,而不是byref。我已经改变了我的代码,以包含通过ref处理对象的方法,现在这可行。
答案 0 :(得分:2)
HttpContext存在于单个请求的生命周期内。我假设你在线程中讨论的是在多个请求中保持状态。如果是这样HttpContext.Items不是你想要的。您可能希望使用Application Cache或其他一些缓存机制。
作为附注,将项目放入HttpContext.Items不会序列化它。如果您使用缓存序列化取决于您是否有缓存的后备存储,但由于这是缓存特定的,它实际上取决于您选择的缓存。
我的理解是它返回对您放入系统的同一个实例的引用。我使用HttpContext存储我的nHibernate会话,其中有很多东西。工作很棒。
答案 1 :(得分:0)
正如乔希已经提到的,如果你想在单个请求中缓存,那么httpcontext.items就是你要走的路。如果这不起作用那么你必须做错了什么,你究竟在哪里将数据添加到httpcontext.items?我通常使用httpmodule并在begin_request处理程序中添加数据,但这一切都取决于你想要做什么
答案 2 :(得分:0)
我可能错了,但我没有看到任何锁定实现,如果/当许多线程尝试创建/使用/更改对象时,您可能会遇到各种问题。