2012-02-28 2 views
4

Вопрос:Как перезаписать свойство сеанса?

Обычно, один доступ к объекту сеанса, как это:

Session["foo"] = "bar"; 

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

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

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

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

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

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

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

+0

Это переопределяет, также, действительно не понимает суть вашей проблемы. – leppie

+0

Хм, на стороне, это похоже на идеальное применение обхода/функции перехвата для .NET. Я мог бы использовать основу мола. –

+1

Вам это действительно нужно?Как насчет добавления вспомогательных методов в качестве методов расширения класса HttpSession? –

ответ

0

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

  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. Но это должно облегчить перенос устаревшего кода на объект доступа к сеансу.

+0

И тогда я должен заменить все экземпляры ascx и ascx, и если он используется в классе, он все равно падает. Я больше ищу что-то в этом роде: http://stackoverflow.com/questions/8487801/mocking-session-variable-in-unit-test-using-moles –

+0

@ Quandary, к сожалению, 'HttpSessionState' является запечатанный класс и, следовательно, нельзя ставить какую-либо пользовательскую реализацию состояния сеанса в контексте http. Да, это можно было насмехаться, но насмехаться можно дорого! – VinayC

+0

Хм, основа мола говорит, что он работает на закрытых классах –

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