Несколько сериализаций на сервере состояний поврежденного значения свойства - PullRequest
2 голосов
/ 21 июля 2011

У меня ненормальное поведение сериализации / десериализации в моем приложении 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 вместо частного поля / свойства, и он работает нормально, однако использование сессии на сильно загруженных веб-сайтах - не лучшая вещь, и я надеюсь найти какое-то другое решение.

Спасибо.

1 Ответ

0 голосов
/ 01 августа 2011

Вы уверены, что значение становится поврежденным, или вы просто теряете значение из-за очистки сеанса. Есть ли у вас какие-либо другие значения в сеансе, которые исчезают одновременно? Я был немного смущен вашим заявлением «Состояние хранится в процессе состояния ASPNET». У вас установлено управление сессиями InProc или вы используете StateServer? Если это InProc, вы определенно испытаете потерю значений сеанса (особенно в средах с общим хостингом) и должны переключиться на решение ASP State Server Service или MSSQL State Server.

...