为什么ASP.NET中有两个不兼容的会话状态types?

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

  • System.Web.SessionState.HttpSessionState ,可在HttpApplication
  • System.Web.HttpSessionStateBase ,在Controller可用

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

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

为什么这样的API? 我错过了两者之间有一个重要的区别?

在ASP.NET MVC抽象了经典的HttpContext对象Request,Response,Session的介绍。 它们代表了抽象类,并暴露在MVC框架中,隐藏了底层的上下文,简化了unit testing,因为抽象类可以被嘲弄。

例如对于会话对象,你有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,其中包含裸会话。