HttpContext.Current.Items的用途

HTTP是一个无状态的协议。每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况。
而实际上,我们的系统往往要支持用户在客户端浏览器和服务端之间的多次请求共用相同的数据(状态),比如用户的登陆账号信息。于是乎,ASP.NET提供了很多变量来管理状态:比如application state,session state,view state等。
HttpContext对象只针对一个单一的http请求。这个类的属性还有Request对象、Response对象、Session对象等。这里要说的是HttpContext类的Items(属性) 集合,它包含了key-value形式的哈希表对象。

首先,我们看HttpContext.Current.Items的用途,它只作用于单独的一个用户请求(HttpContext.Current.Items valid for a single HTTPRequest)。完成这个请求,服务器信息传回浏览器的时候,这个Item集合将丢失。而Session对象是针对用户的本次会话,也就是作用 于多个用户请求,在Session失效后才丢失其中的信息。

既然HttpContext.Current.Items的生命周期如此之短,那在什么情况下可以加以利用呢。
这里指出,HttpContext.Current.Items 可以在 HttpModule 和 HTTPHandler 之间共享数据时使用,因为每次用户请求都要通过HTTP 运行时管道HttpModule 、HTTPHandler 。当你实现IHttpMoudle的方法来通过HttpMoudle向用户请求传递信息。你可以用HttpContext.Current.Items 在不同请求页,不同的HttpModule中传输数据,但是一旦请求结束,数据回发,这个集合中的数据将自己丢失。如下图所示:


另外,当服务端页面跳转(Server.Execute/Server.Transfer)时,我们可以使用HttpContext.Current.Items在两个表单之间传递数据。

/*** WebForm1: ***/
private void Page_Load(object sender, System.EventArgs e)
{
    ArrayList list = new ArrayList(4);
    list.Add("This list ");
    list.Add("is for ");
    list.Add("WebForm2 ");
    list.Add("to see. ");
    Context.Items["WebForm1List"] = list;
    Server.Transfer("WebForm2.aspx");
}
/*** 对于WebForm2: ***/
private void Page_Load(object sender, System.EventArgs e)
{
    ArrayList list = Context.Items["WebForm1List"] as ArrayList;

    foreach(string s in list)
    {
        Response.Write(s);
    }
}

很显然,如果把Server.Transfer改为Response.Redirect的时候,由于是不同的Http请求,在新的页面里是无法获取到HttpContext.Current.Items里的数据的。这时会报System.NullReferenceException: 未将对象引用设置到对象的实例。

资料:

http协议无状态中的 "状态" 到底指的是什么?!http://www.cnblogs.com/bellkosmos/p/5237146.html

关于HttpContext的Items属性 http://www.jcwcn.com/article-14459-1.html

时间: 2024-11-05 18:47:12

HttpContext.Current.Items的用途的相关文章

HttpContext.Current并非无处不在

原文地址:http://www.cnblogs.com/fish-li/archive/2013/04/06/3002940.html 阅读目录 开始 无处不在的HttpContext HttpContext.Current到底保存在哪里? HttpContext并非无处不在! 如何获取文件绝对路径? 异步调用中如何访问HttpContext? 安全地使用HttpContext.Current 了解ASP.NET的开发人员都知道它有个非常强大的对象 HttpContext,而且为了方便,ASP.

[掌眼]解决Castle.ActiveRecord在ASP.NET或WCF环境中HttpContext.Current无效的错误

AR設定檔要指定threadinfotype,不指定的話,預設值是用WebThreadScopeInfo,是用 HttpContext.Current.Items 來存放 SesionScope,所以碰到與UI無關的執行緒,沒有 HttpContext.Current 程式就掛啦. 解决方案一: 1.检查“web.config” <activeRecord isWeb="true" isDebug="false"> <config>... .

HttpContext.Current

阅读目录 开始 无处不在的HttpContext HttpContext.Current到底保存在哪里? HttpContext并非无处不在! 如何获取文件绝对路径? 异步调用中如何访问HttpContext? 安全地使用HttpContext.Current 了解ASP.NET的开发人员都知道它有个非常强大的对象 HttpContext,而且为了方便,ASP.NET还为它提供了一个静态属性HttpContext.Current来访问它, 今天的博客打算就从HttpContext.Current

Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache

在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是System.Web.Caching.Cache类的实例.那为什么需要同时提供两种支持呢? 查询MSDN后发先,这两个缓存的应用的场景不一样, HttpRuntime.Cache是应用程序级别的缓存, HttpContext.Current.Cache是针对Web上下文定义的, 是一个局部的缓存.(这段

多线程下HttpContext.Current 的问题

在项目中需要记录文本日志,为了加快响应速度所以用到了多线程. 但是以前的方法是不支持多线程的,程序运行错误. 追踪代码发现提示HttpContext为空. 1.HttpContext.Current表示当前HttpRequest   对应的Context对象 httpContext.current在不同的httpRequest   中是变化的          也就是说用httpConext.current.items来保存的数据是不能跨页面传递的. 2.HttpContext.Current只

HttpContext.Current.Session 和 Session 的区别

Session(会话)通常指一个动作从开始到结束不间断的一个动作. 例如“打电话”,通常是“1.拿起电话--2.拨对方号码--3.对方截图--4.挂机”.这四个步骤从完成到结束组成了一个基本的Session,中间任何一步断裂,都会导致Session的失效. 而在浏览器里,Session主要通过连接传递,“打开购物--点击连接选择物品--添加到购物车--结账”组成了一个Session,在不使用Cookie的情况下,中间任何一步断裂都会Session失效. 所有,你用浏览器打开2个页面,在一个页面里

HttpContext.Current.Session[strName]未将对象引用设置到对象的实例

项目开发是在4.5.1上,不知道为啥客户提供的服务器上安装的是4.5,差别不大也没去升级,然后部署MVC的时候web.config报错 <system.web> <compilation debug="true" targetFramework="4.5.1"/> <httpRuntime targetFramework="4.5.1"/> </system.web> 然后也没在意就把这段给删掉了,

NET Core中怎么使用HttpContext.Current

NET Core中怎么使用HttpContext.Current 阅读目录 一.前言 二.IHttpContextAccessor 三.HttpContextAccessor 回到目录 一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目前是不可用的,因为ASP.NET Core中是并没有这个API的. 当然我们也可以通过在Controller中访问

HttpContext及HttpContext.current

慎用System.Web.HttpContext.Current http://www.cnblogs.com/david1989/p/3879201.html 线程编程中用到HttpContext.Current的方法封装 http://www.cnblogs.com/xdotnet/archive/2007/06/25/aspnet_threading_httpcontext.html HttpContext只是个类名,HttpContext.Current才是一个已实例化的对象..比如这样