为什么ASP.NET中存在两种不兼容的会话状态类型?

时间:2011-03-27 06:26:12

标签: .net asp.net asp.net-mvc-3 session-state

我在ASP.NET MVC中看到了两种使用会话数据的方法:

  • System.Web.SessionState.HttpSessionState,可在HttpApplication
  • 上找到
  • System.Web.HttpSessionStateBase,可在Controller
  • 上找到

存储在一个中的数据似乎在另一个中可用。

不幸的是,这两种类型的唯一共同祖先是System.Object,这意味着我无法为抽象的任何一种创建可重用的实用程序代码。

为什么API会这样?我失踪的两者之间是否有重要区别?

1 个答案:

答案 0 :(得分:86)

在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进行裸会话。