【问题标题】:Why are there two incompatible session state types in ASP.NET?为什么 ASP.NET 中有两种不兼容的会话状态类型?
【发布时间】:2011-07-23 18:53:44
【问题描述】:

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

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

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

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

为什么 API 是这样的?我缺少的两者之间有重要区别吗?

【问题讨论】:

  • 我刚刚发现与RequestRequestBase 相同的模式。是否有两个基本 API 部分的并行版本?

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


【解决方案1】:

在 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,您可以在其中进行裸会话。

【讨论】:

  • 优秀的答案达林!非常感谢。
  • 你也可以创建new HttpRequestWrapper(HttpContext.Current.Request)new HttpResponseWrapper(HttpContext.Current.Response)
猜你喜欢
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2021-12-08
  • 2014-12-28
相关资源
最近更新 更多