ObjectContext и кеширование по запросу - получение ObjectDisposedException - PullRequest
0 голосов
/ 05 октября 2011

Я использую ObjectContext и храню его в коллекции HttpContext.Current.Items. Я разделяю ObjectContext для одного запроса, но платформа также позволяет загружать свежую, не кэшированную, отличную копию ObjectContext путем включения флага. Таким образом, для определенных сценариев я могу вообще обойти HTTPContext. Есть веские причины для этого; Во-первых, у меня есть различные статические ссылки, которые используют ObjectContext, поэтому каждая из этих статик получает свою собственную копию. Другие сценарии состоят в том, что конкретный процесс может выполняться изолированно, поэтому он должен быть уникальным.

Я пытаюсь избавиться от общего ObjectContext в Page Unload, и иногда это работает нормально, но время от времени я получаю исключения ObjectDisposedException по запросам (потому что какой-то процесс пытается прочитать данные и вызывает их). Я имею в виду, что я получу это исключение один раз, вызову обратную передачу и получу ошибку и для этого запроса, и для следующих запросов. Закрытие и повторное открытие браузера работали, но потом я иногда получал ошибку. Это случайно; однажды страница работает, позже нет. Это та же страница, так что это не ошибка логики.

Это заставляет меня верить, что:

  • Коллекция HttpContext.Current.Items НЕ изолирована для одного запроса HttpRequest на пользователя ИЛИ:
  • Статика как-то влияет на процесс и удаление общего соединения ИЛИ:
  • Есть ошибка, которую я должен продолжать исследовать ....

Кто-нибудь испытывал проблемы с первыми 2 предметами? Мое понимание неверно?

1 Ответ

0 голосов
/ 05 октября 2011

Ни один из первых 2 предметов не должен произойти.HttpContext определенно используется для обработки одного HTTP-запроса, и если статика не обращается к HttpContext, они не должны влиять на ваш контекст.

Существует другая причина для такого случайного поведения.Убедитесь, что вы не разделяете прокси / присоединенные объекты среди запросов (через сеанс или кэш) или не используете их после удаления контекста из static.

По умолчанию все объекты POCO являются прокси, и они сохраняют внутреннюю ссылку на контекст.Ссылка на контекст необходима для динамического отслеживания изменений и отложенной загрузки.Поэтому, если вы не отсоедините сущность вручную перед удалением контекста, она сохранит ссылку на удаленную сущность, и первое изменение данных или доступ к незагруженному свойству навигации в кэшированной сущности вызовет это исключение.EntityObject сущности на основе делают то же самое.

...