Http上下文与会话

在编码中,我们常常会碰到一个概念:上下文,如 线程上线文(Thread.CurrentContext),Http上下文(HttpContext.Current)等,那么上下文到底是什么,它们存在的意义是什么?

一:上下文

1:来源

可能无从追溯,但是早期 上下文 这个概念,可能来自于 CPU时间片 的切换。在单CPU阶段,我们知道,虽然程序可以模拟出来是多进程(如多个EXE)或多线程运行的,但是实际上到了CPU这个层面,同时只能执行一条指令。CPU的快速切换,为程序模拟出来了多进程执行,但是,为了这种模拟,即:当一个进程时间片到了或者资缺的时候就会让出cpu,当另一个进程开始始用CPU之前,系统要保存即将退出进程的执行状态,以便轮到时间片或有资源的时候现场恢复,这就所谓的 上下文切换。

后来,我们把保留状态、以及恢复状态这种事情,都叫成了 上下文切换。Http上下文,指的就是这种情况,服务器要应对来自各地的请求,每次请求之间的状态保留和恢复(主要是 Request、Response、Session-即会话等)就叫做 Http上下文 切换,那么,这些工作所在的这个类,在 .NET 中,就是 HttpContext。

上下文的更进一步阅读,可以参考:http://blog.csdn.net/shyc1922/article/details/6876412

2:HttpContext.Current 的本质

现在,回归到语言学上的本质,其本质必定是一个 static 的对象,为什么,因为如果不是 static 的,我们就不能快捷的访问它。试想,如果是 new HttpContext 的,就会给程序员造成误解,原来上下文每次请求都是重新生成的呀。它当然不应该是,为什么呢,因为本次请求的上下文信息在上次请求中就已经是存在的了。这是 Current 属性的源码:

如果再沿着 ContextBase.Current 跟踪下去,还可以追踪到这里,可以看到,Http上下文 居然也是和 Thread 相关的,这也从另一个方面印证了其实上下文在本质上都是某种状态的保存和切换:

二:会话

1:会话是什么?

现实世界中,会话就是两个人直接的对象,只要两个人还存在,就可以一直延续对话,在 WEB 应用中,这两个人一个就是客户端,一个就是服务器,只要客户端还在有效时间内,那么跟服务器就可以继续通信,并且服务器还能知道你就是那个北京的客户端,而不是上海的客户端,虽然可能上海也有客户端在跟我通信。那么,知道你就是那个北京的客户端,就是 HttpContext 所干的事情(底层),而客户端和服务器通信的数据(上层),就是会话数据,这些通信数据可以被储存在 Session(即会话) 中。

2:会话的本质

有了上面的理解,我们可以发现,会话不就是上下文吗。其实,这么理解是正确的,只不过,上下文偏向于底层多一点,而会话偏向于上层多一点。由于 Session 是依附在 Http上下文 中的,所以 Session 也就变成 static 的了。那么 Session 的本质是什么呢:

其本质是个 Items,它就是个 Dictionary。如果我们自己要实现一个所谓的 Session,我们本质上完全可以类似这样来实现:

class MyContent
{
    public static Dictionary<string, object> Session = new Dictionary<string, object>();
}

3:Session的限制

ASP.NET 默认实现的 Session 机制,是把数据保存在了内存中,内存在不够的时候的,数据是要易失的,所以 ASP.NET 引擎也提供了其它的数据保存机制,如数据库,同时它也允许我们自己实现自己的数据保存。

4:利用默认的 Session 数据保存机制

即便这样,Session 仍旧有广泛的应用,如:保存业务逻辑意义上的会话。如,在 领域驱动开发 中,领域模型 对象可以保存在会话中,因为领域模型是有状态的,它有维护自己状态的 Key,我们可以利用这一点,将对象保存在 Session 中,这样,就没有必要每次请求,都重新恢复 领域对象,因为恢复领域对象,就意味着要从数据库中进行读取,而交给 Session,我们就可以绕开数据库读取,只要在对象被失去的时候,再从新从数据库恢复就可以了。

Http上下文与会话

时间: 2024-10-18 06:11:03

Http上下文与会话的相关文章

第二节 会话的概念

import tensorflow as tf ''' TensorFlow分为前端系统和后端系统 前端系统:定义程序的图和结构,即各类语言通过API接口写的程序 后端系统:运算图的结果 会话:即连接前后端的中间者,起到调度资源的效果 运行图结构 分配计算资源 掌握资源(队列,线程,变量的资源) ''' a = tf.constant(5.0) b = tf.constant(6.0) # 用run方法打印sum2的时候会报错,因为不是op型,但是如果一部分数据是op型的,那会进行强制转化进行运

Oracle 11g数据库详解(2015-1-18更新)

Oracle 11g数据库详解 整理者:高压锅 QQ:280604597 Email:[email protected] 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1   简介 数据库操作主要有以下几步: 1.  启动.停止数据库 2.  连接.断开数据库 3.  创建.修改.删除数据库用户 4.  表空间 5.  新建.修改.删除表 6.  查询.插入.修改.删除表数据 7.  新建.修改.删除视图 8.  新建.修改.删除存储过程 9.  新建.修改.删除触发

Hibernate对象的CRUD操作

1.  Hibernate对象的CRUD操作 1.1.  对象的三种状态 瞬时(Transient) - 由new操作符创建,且尚未与HibernateSession 关联的对象被认定为瞬时(Transient)的.瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier).如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁.使用Hibernate Session可以将其变为持久(Persis

Jsp中EL表达式的使用

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka   1.什么是EL EL是JSP表达式语言,全称是ExpressionLanguage,使用EL的目的是简化在JSP中访问变量的方式,简单静态HTML与Java代码的耦合.下面来看看一个例子: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding=

Jetty 9嵌入式开发

官方网址:http://www.eclipse.org/jetty/ 下载地址:http://download.eclipse.org/jetty/stable-9/dist/ 文档网址:http://www.eclipse.org/jetty/documentation/ 当前Jetty网址上推荐使用的稳定版本:Jetty9.0. 介绍 Jetty9内容位于http://www.eclipse.org/jetty/documentation. 直接链接: http://www.eclipse.

【AMQ】之JMS概念

1.JMS(Java Message Service)Java消息服务,是Java20几种技术其中之一 2.JMS规范定义了Java中访问消息中间件的接口,但是没有给实现,这个实现就是由第三方使用者来开发实现,我们称为JMS provider,例如AMQ 3.实现了JMS接口和规范的消息中间件我们称为:JMS提供者(JMS Provider) 4.JMS Message 由三部分组成 消息头,每个消息对应的get set方法 消息属性, 消息体,具体业务数据 JMS producer ,消息生产

SOA初探

背景 曾今SOA的概念犹如今日“云计算.大数据”一样,被炒得火热,不少企业便纷纷响应,并宣称会拥抱和实施SOA.而事实上,业界出现了两种极端:一种是由于各类文章和书籍关于SOA的描述往往太过抽象,再加上各大厂商的呼吁,使得SOA往往显得“高大上”,令不少企业和架构师们望而却步.第二种恰好相反,有部分人却认为SOA无非是“新瓶装旧酒”. 个人理解,SOA在宏观上确实太复杂,因为它涉及到的不仅仅是技术和架构本身.而从技术的视角来看,并非难以落地. SOA全称“面向服务架构”,它提供的是一种架构风格和

java web项目答辩答辩题总结

答辩每个人的总分为1.5分.每个人主要问3个问题. 开发流程===>系统架构====>项目模块+功能===>项目得失重定向与转发:?九个隐式对象?get与post的区辨:?jsp有静态包含,动态包含,两者的区辨:?什么是MVC:?web系统架构:? java web项目答辩 1 http协议全名和特点 ------------------------------------------------------ HTTP是一种超文本传输协议(HyperText Transfer Proto

第六篇 SQL Server安全执行上下文和代码签名

本篇文章是SQL Server安全系列的第六篇,详细内容请参考原文. SQL Server决定主体是否有必要的执行代码权限的根本途径是其执行上下文规则.这一切都可能复杂一个主体有执行代码的权限,但是却没有访问代码中基础对象的权限,比如表中的数据.这一篇将探讨SQL Server的执行上下文.所有权链接和模拟,以及告诉你如何通过T-SQL代码控制访问数据.执行上下文当用户执行一个存储过程或其他数据库代码,SQL Server检查以确保用户不但有执行过程权限,而且有代码访问的数据库对象的权限.如果没