2011-02-03 2 views
5

Я ищу некоторые умные идеи о том, как быстро найти все использование состояния сеанса в существующем приложении asp.net (MVC).Поиск всего использования состояния сеанса

Заявка, о которой идет речь, была предметом аутсорсингового развития и работает отлично в производстве. Но недавно мы поняли, что он использует состояние сеанса InProc, а не (наш предпочтительный маршрут) StateServer.

В небольшом тесте мы переключили его на StateServer, и все работало нормально. Однако, когда мы развернулись к производству, мы неожиданно столкнулись с большим количеством ошибок. Я не уверен, были ли эти ошибки вызваны этим изменением (на самом деле они жаловались на проблемы с уровнем базы данных), но удаление изменения позволило снова функционировать приложение (возможно, это было связано с тем, что это вызвало рециркуляцию).

Итак, прежде чем я попытаюсь переключить его снова, я бы хотел провести тщательный аудит всех объектов, которые были помещены в сеанс (я раньше быстро просмотрел пару контроллеров, и они казались прекрасными). Если бы у меня был полный контроль над кодом, это место, где я просто прокомментировал класс (для компиляции и поиска различных способов доступа к классу сеансов), затем закомментируйте аксессоров, удалите компиляцию и посетите каждая ошибка. Но я не могу этого сделать со встроенными .NET-типами.

Итак, любые умные идеи о том, как найти каждое использование?


Я решил попробовать использовать рефлектор. Я проанализировал «Используется» для каждого из следующих действий:

System.Web.HttpSessionStateBase.set_Item(String, Object) : Void 
System.Web.SessionState.HttpSessionState.set_Item(String, Object) : Void 
System.Web.SessionState.HttpSessionState.set_Item(Int32, Object) : Void 
System.Web.HttpSessionStateBase.set_Item(Int32, Object) : Void 
System.Web.HttpSessionStateBase.Add(String, Object) : Void 
System.Web.SessionState.HttpSessionState.Add(String, Object) : Void 

(и проверить, что мы не используем TempData в любом месте). Упускаю ли я какие-либо другие маршруты, по которым элементы могут попасть в сеанс?

+1

вы можете сделать свой собственный провайдер SessionState, который оборачивает поставщика InProc, но регистрирует каждый вызов, чтобы добавить, удалить и получить http://msdn.microsoft.com/en-us/library/ms178587.aspx , Таким образом, вы можете использовать стек вызовов для отслеживания каждого использования сеанса в вашем коде. –

ответ

0

Я говорю, что решение широко используется для поиска «Сессия». Помимо этого, если это приложение ASP.Net MVC, то не забывайте, что TempData также является сеансом.

+0

Я получаю много ложных срабатываний для этого - есть много работы с nHibernate, что также говорит о Сессии. –

+0

Aaah! nHibernate-сессия. Существует ли вероятность того, что слой, который работает с сеансом nhibernate, не пытается использовать веб-сеанс (достаточно изолированный только для операций с данными).Если да, то вы можете ограничить свой поиск только веб-проектом. – Pradeep

2

Вы можете получить исходный код для asp.net MVC. искать использования сессии

http://aspnet.codeplex.com/releases/view/58781 для MVC 3 http://aspnet.codeplex.com/releases/view/41742 для MVC 2 http://aspnet.codeplex.com/releases/view/24471 для MVC 1

Я на самом деле нашел это весьма полезно иметь прокладки вокруг, когда вам нужно выяснить, почему-то делая то, что он делает.

MVC 2 не запускается с выключенным сеансом, поэтому он может использовать сеанс способами, не совместимыми с сервером состояний.

Из-за ошибок БД звучит как nHibernate, возможно, что-то делает. Вы можете получить источник для этого, чтобы посмотреть на него, но я уверен, что использование сеанса будет задокументировано.

Simon

Смежные вопросы