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

61

我发现ASP.NET MVC中有两种处理会话数据的方法:

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

两者存储的数据似乎都可以在另一个中访问。

不幸的是,这两种类型唯一的共同祖先是System.Object,这意味着我不能为它们创建可重用的实用程序代码来进行抽象。

为什么API是这样的?我是否忽略了它们之间的重要区别?


我刚刚发现了RequestRequestBase中相同的模式。基本API部分有两个平行版本吗? - Drew Noakes
1个回答

101

在ASP.NET MVC中,对经典的HttpContext对象Request、Response和Session进行了抽象。它们表示抽象类,并且在整个MVC框架中公开,以隐藏底层上下文并简化单元测试,因为抽象类可以被模拟。

例如,对于session对象,您可以使用HttpSessionStateBase及其实现HttpSessionStateWrapper

以下是如何在经典ASP.NET session和抽象之间转换的示例:

HttpSessionStateBase session = new HttpSessionStateWrapper(HttpContext.Current.Session);
所以你所提到的 System.Web.SessionState.HttpSessionState 是自经典ASP.NET 1.0以来就存在的底层会话对象。在MVC中,这个对象被包装成一个 HttpSessionStateWrapper。但由于ASP.NET MVC是一个ASP.NET应用程序,因此您仍然可以获得Global.asax,在其中您拥有原始的会话对象。

1
您还可以创建 new HttpRequestWrapper(HttpContext.Current.Request)new HttpResponseWrapper(HttpContext.Current.Response) - Benj Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接