it-roy-ru.com

Почему в ASP.NET есть два несовместимых типа состояния сеанса?

Я вижу два способа работы с данными сеанса в ASP.NET MVC:

  • System.Web.SessionState.HttpSessionState, доступно на HttpApplication
  • System.Web.HttpSessionStateBase, доступно на Controller

Данные, хранящиеся в одном, кажется, доступны в другом.

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

Почему API это так? Есть ли важное различие между этими двумя, которые мне не хватает?

58
Drew Noakes

В ASP.NET MVC были представлены абстракции над классическими объектами HttpContext Request, Response, Session. Они представляют абстрактные классы и доступны во всей MVC-структуре, чтобы скрыть базовый контекст и упростить модульное тестирование, поскольку абстрактные классы могут быть смоделированы.

Например, для объекта сеанса у вас есть HttpSessionStateBase и его реализация HttpSessionStateWrapper .

Вот пример того, как преобразовать между классическим сеансом ASP.NET и абстракцией:

HttpSessionStateBase session = new HttpSessionStateWrapper(HttpContext.Current.Session);

Таким образом, System.Web.SessionState.HttpSessionState, на который вы ссылаетесь, является базовым объектом сеанса, существовавшим со времен классического ASP.NET 1.0. В MVC этот объект обернут в HttpSessionStateWrapper. Но поскольку ASP.NET MVC является приложением ASP.NET, вы все равно получаете Global.asax, в котором у вас есть пустой сеанс.

86
Darin Dimitrov