Определение того, какой элемент управления сериализуется

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

Я получаю сообщение об ошибке:

Тип «System.Web.UI.Control» в сборке «System.Web, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a» не помечен как сериализуемый.

Проблема в том, что я не могу определить, какой элемент управления пытается сериализоваться.

Полное исключение и трассировка стека не показывают мне никакой дополнительной информации.

Есть ли способ определить, какой элемент управления пытается сериализоваться?

Использование ASP.net, IIS7, Framework 4.0


person AaronS    schedule 08.11.2011    source источник
comment
Почему элементы управления сериализуются и хранятся в сеансе в первую очередь?   -  person James Johnson    schedule 08.11.2011
comment
Хороший вопрос. :) Это устаревшее приложение, доставшееся мне по наследству, и я его обновляю. Одна из целей — вообще прекратить хранить их в сеансе.   -  person AaronS    schedule 08.11.2011
comment
Вы сузили его хотя бы до страницы? Можете ли вы установить точку останова где-нибудь, чтобы увидеть, где он бомбит?   -  person James Johnson    schedule 08.11.2011
comment
В основном это происходит, когда приложение загружается впервые, после входа пользователя в систему, и все инициализируется. Процесс инициализации довольно объемный, поэтому нелегко пройти каждый шаг, чтобы увидеть, где что-то может быть добавлено в сеанс. Возможно, мне придется сделать это, если нет более простого способа узнать, где элемент управления добавляется в сеанс.   -  person AaronS    schedule 08.11.2011


Ответы (1)


Выполните глобальный поиск Session[ или Session.Item и найдите все со знаком = справа. Это все назначения Session. Не больше нескольких сотен. Одним из них является System.Web.UI.Control. Вероятно, он был помещен в сеанс, чтобы избежать попадания в базу данных. Перепишите этот код для хранения DataTable или DataSet или других значений вместо сохранения Control.

Если у вас нет исходного кода, нет простого способа справиться с этим, если не считать декомпиляции, исправления кода и перекомпиляции.

Даже если вы откажетесь от SqlSession, вы все равно можете прекратить размещать элементы управления пользовательского интерфейса в Session — это может вызвать проблемы с OutOfMemory: http://blogs.msdn.com/b/tess/archive/2008/28/05/asp-net-memory-thou-shalt-not-store-ui-objects-in-cache-or-session-scope.aspx

person MatthewMartin    schedule 08.11.2011
comment
Ни один из них не добавляется напрямую через вызовы session[]. Я считаю, что они спрятаны где-то внутри объекта данных, но многократные поиски ничего не дали. Конечная цель состоит в том, чтобы убедиться, что никто не добавляется в сеанс вообще, как только я смогу определить, где они находятся. - person AaronS; 08.11.2011
comment
Включите trace.axd и проверьте переменную сеанса. Он покажет ключ, тип и значение. Затем найдите этот ключ в исходном коде. Опять же, если у вас нет исходного кода (т. е. если это сторонний код или исходный код утерян), у этого не будет решения. - person MatthewMartin; 08.11.2011
comment
Хороший звонок. Хотя это не сказало мне напрямую, что вызвало проблему, оно показало мне, какие конкретные объекты данных были сохранены в сеансе. Я смог пройтись по каждому из них, чтобы определить, где добавляется элемент управления. Спасибо за помощь. - person AaronS; 08.11.2011