Как мне сохранить объект между потоками без использования httpcontext.items?
-
05-09-2019 - |
Вопрос
У меня есть объект, который обрабатывает кэширование памяти для моего уровня доступа к данным (DAL), и мне нужно сохранить его между потоками. Из того, что я прочитал, предпочтительный метод - это использовать httpcontext.item с кодом, как SO:
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, Code 0xe053534f, Offset 0x0000000026499d, Process Id ID. Анкет
а также
Сервер штата закрыл срок действия TCP/IP -соединения. IP -адрес клиента составляет 127.0.0.1. Срок действия операции чтения началась в 04.07.2009 20:44:29.
Затем я перефразировал код, чтобы поместить элементы в словарный объект против идентификатора сеанса, и я получаю эти ошибки SMAE. Если я использую статические переменные, это работает нормально, но тогда у меня возникнут моя первоначальная проблема, которая заключается в том, что пользователи будут получать доступ к данным другим пользователям (очевидно, это не вариант).
Перефразированная версия выглядит следующим образом: (это работает для первого метода, но не для этого)
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. Я изменил свой код, чтобы включить методы, которые занимаются объектами, и теперь это работает.
Решение
Httpcontext существует в течение жизни одного запроса. Я предполагаю, что по тему здесь вы говорите о поддержании состояния, приобретая несколько запросов. Если это так, то httpcontext.items не то, что вы хотите. Вы хотели бы использовать кеш приложения или какой -то другой механизм кэширования.
В качестве примечания поместите элемент в httpcontext.items не сериализует его. Если вы идете с сериализацией кэша, зависит от того, есть ли у вас хранитель поддержки для кеша, но, поскольку это специфично к кешу, это действительно зависит от выбранного вами кэша.
Редактировать
Насколько я понимаю, он возвращает ссылку на тот же экземпляр, который вы вкладываете в систему. Я использую httpcontext для хранения моих сеансов Nhibernate, в которых довольно много вещей. Работает потрясающе.
Другие советы
Как уже упоминал Джош, если вы хотите кэшировать во время одного запроса, то httpcontext.items - это путь. Если это не работает, то вы должны делать что -то не так, где именно вы добавляете данные в httpcontext.items? Я обычно использую httpmodule и добавляю данные в обработчике begin_request, но все зависит от того, что вы пытаетесь сделать
Я мог бы ошибаться, но я не вижу никакой блокировки, вы можете ожидать все виды проблем, если/когда многие потоки попытаются создавать/использовать/изменить объект.