У меня ненормальное поведение сериализации / десериализации в моем приложении ASP.NET MVC.
Настройка и архитектура следующие:
.Net 3.5, MVC 2, Unity 2.0 для внедрения зависимостей, IIS 7. Состояние сохраняется в процессе состояния ASPNET. Приложение, помимо моделей, представлений и контроллеров, также содержит ряд сервисов для конкретных приложений и картографов моделей (для взаимодействия с существующим кодом). Две службы имеют время жизни на основе сеанса, для которого я реализовал пользовательский PerSessionLifetimeManager
(так как Unity не имеет ни одной из готовых). Этот менеджер времени жизни использует HttpContext.Current.Session
для хранения объектов. Между контроллерами, мапперами, сервисами, а также между сервисами существует немало зависимостей.
Проблема:
Одна из служб времени жизни сеанса содержит приватное логическое поле, которое изменяет значение при некоторых внутренних логических условиях, однако это значение изменяется вне моего кода. После некоторого исследования я обнаружил, что проблема связана с тем, что этот объект сериализуется / десериализуется дважды каждый раз, а значения поля отличаются во время сериализации.
Расследование, проведенное до настоящего времени:
У меня есть точки останова / вход в конструктор объекта, и я обернул поле в свойство и установил точку останова / запись в сеттер. Объект определенно создается только один раз, и нет никаких вызовов для изменения значения свойства, кроме тех, которые должны быть вызваны. Я сделал объект для реализации ISerializable
и поставил логирование System.Threading.Thread.CurrentThread.ManagedThreadId
и хэш объекта (построенный из всех полей объекта). Из того, что я могу видеть, если значение свойства / поля изменений объекта сериализуется дважды, один раз с новым значением и сразу после с исходным значением. В следующий раз, когда используется объект, он десериализуется в порядке LIFO, поэтому сначала извлекается исходный (неизмененный) объект значения, а затем измененный. Я попытался записать полную трассировку стека для этих вызовов сериализации, но, похоже, это все внутренние вызовы .Net.
Вопросы:
Почему существует несколько сериализаций с разными значениями? Как этого избежать?
Текущий обход:
Я использовал Session вместо частного поля / свойства, и он работает нормально, однако использование сессии на сильно загруженных веб-сайтах - не лучшая вещь, и я надеюсь найти какое-то другое решение.
Спасибо.