我在ASP.NET MVC中看到了两种使用会话数据的方法:
System.Web.SessionState.HttpSessionState
,可在HttpApplication
System.Web.HttpSessionStateBase
,可在Controller
存储在一个中的数据似乎在另一个中可用。
不幸的是,这两种类型的唯一共同祖先是System.Object
,这意味着我无法为抽象的任何一种创建可重用的实用程序代码。
为什么API会这样?我失踪的两者之间是否有重要区别?
答案 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进行裸会话。