Как переписать свойство сессии? - PullRequest
3 голосов
/ 28 февраля 2012

Вопрос:

Обычно каждый обращается к объекту сеанса следующим образом:

Session["foo"] = "bar";

Я написал поверх него обертку, которая является общей и которая проверяет, истек ли сеансили нет, и выдает SessionExpiredException, если это так.

Чтобы использовать мой доступ к сеансу, мне нужно получить доступ к сеансам через мой класс, как это

WebApplications.SessionAccess.Set<string>("foo", "bar");

Теперь, очевидно, несмотря наПри наличии класса SessionAccess можно все же получить доступ к сеансу через обычный объект сеанса.Это нежелательно, и, кроме того, я хочу позже включить его в более крупный старый проект, который был написан с использованием обычного сеанса, что означало бы, что мне придется заменить все вызовы сеанса (число в младших тысячах) на моиобертка.

Есть ли способ, которым я могу перезаписать System.Web.HttpSessionStateBase.Controller.Session - Свойство с моим собственным?

Дело в том, что не определен пользовательский обработчик сеансав web.config, потому что иногда уже есть один для использования базы данных для сессий (все еще можно инициализировать модуль в Global.asax).

Эти YSOD исключения NULL-Reference на SessionTimeout являются гипер-тревожный.Если возможно, решение, которое работает как на классических веб-формах ASP.NET, так и на MVC.

1 Ответ

0 голосов
/ 28 февраля 2012

Я не думаю, что будет какое-то полное решение, как вы хотите, но несколько хитростей могут сделать вашу жизнь проще.

  1. Создайте еще одну оболочку, которая предоставляет свойство индексатора, чтобы вы могли легко заменить вызовы, такие как Session["key"] = "name", на ваше свойство оболочки;
  2. Вам необходимо наследовать все ваши страницы (то есть классы с выделенным кодом) от общего базового класса страниц (который сам унаследовал косвенно от System.Web.UI.Page). Если у вас уже есть такая базовая страница, значит, вы действительно в хорошей ситуации. Унаследуйте свой базовый базовый класс страницы от внутреннего базового класса, который сам унаследован от System.Web.UI.Page.
  3. В общей базе страниц добавьте новое свойство Session, которое будет возвращать ваш объект-обертку, созданный в # 1. Подобный трюк должен быть сделан для UserControl (и пользовательского элемента управления), если у вас их много. Это избавит вас от замены большинства вызовов Session["key"] = "name".
  4. Наконец, переопределите свойство Session во внутреннем классе базовой страницы, чтобы добавить утверждение отладки. Вы можете вернуть null, но это нарушит производственное использование. Утверждение отладки намного лучше, чтобы найти использование сеанса, которое будет экранировано от # 3.

Как уже говорилось, это не полностью защищенное решение, поскольку все еще можно получить доступ к состоянию сеанса через HttpContext. Но это должно упростить миграцию устаревшего кода в объект доступа к сеансу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...