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

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

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

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

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

推荐答案

在ASP.NET MVC对classic HttpContext对象的请求、响应和会话进行了抽象.它们代表抽象类,并在MVC框架中公开,以隐藏底层上下文并简化单元测试,因为抽象类可以被模拟.

例如,对于会话对象,您有HttpSessionStateBase个及其实现HttpSessionStateWrapper.

下面是一个如何在classic ASP.NET会话和抽象:

HttpSessionStateBase session = new HttpSessionStateWrapper(HttpContext.Current.Session);

因此,您所指的System.Web.SessionState.HttpSessionState是自classic ASP以来一直存在的底层会话对象.NET 1.0.在MVC中,这个对象被包装成HttpSessionStateWrapper.但是自从ASP.NETMVC是一个ASP.NET应用程序,您仍然可以获得全局权限.尽快完成你的裸会话.

Asp.net相关问答推荐

Visual Studio发布的网站得到错误类型JObject is not defined when page is load on server"''"

如何从 Azure 上托管的应用服务获取登录用户名?

如何从 ASP.NET 中的代码隐藏文件访问 IFRAME?

Linq 将复杂类型聚合成一个字符串

某些黑客能否从用户那里窃取 Web 浏览器 cookie 并在网站上使用该名称登录?

没有身份的 ASP.NET Core 2.0 承载身份验证

在asp.net mvc c#中使用cookie

N' 在 SQL 脚本中代表什么? (插入脚本中字符之前使用的那个)

无法确定条件表达式的类型,因为 'string' 和 'System.DBNull' 之间没有隐式转换

如何在 ASP.NET 中仅在调试模式下执行代码

将数据表导出到 Excel 文件

oAuth ASP.NET 成员资格提供程序

如何使用 WebRequest 发布数据并从网页获取响应

@(at) 登录文件路径/字符串

如何使用restsharp下载文件

如何获取程序集的最后修改日期?

ASP.NET 发布try 复制不存在的文件

如何判断字符串的第一个字符是否是字母,C#中的任何字母

字体真棒里面asp按钮

Unity 中的单例每个调用上下文(Web 请求)