HttpContext, HttpRequest, HttpResponse

学习于 http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html

Asp.net有三大核心对象:HttpContext, HttpRequest, HttpResponse。
另外两个重要的对象:HttpRuntime,HttpServerUtility

1.关于HttpRuntime

HttpRuntime对象可以算是整个Asp.net平台最核心的对象,但它包含的很多方法都不是public类型的【公开的不多】,它在整个请求的处理过程中,做了许多默默无闻但非常重要的工作。

HttpRuntime公开了一个大家都熟知的静态属性 Cache,平常用的Page.Cache或者HttpContext.Cache事实上都是HttpRuntime.Cache的【快捷方式】。HttpRuntime.Cache是个非常强大的东西,主要用于缓存一些数据对象, 提高程序性能。虽然缓存实现方式比较多,一个static变量也算是能起到缓存的作用,但HttpRuntime.Cache的功能绝不仅限于一个简单的缓存集合,其中缓存依赖功能算是个特性强大的功能。更有意义的是:它缓存的内容还可以在操作系统内存不足时能将一些缓存项释放(可指定优先级),从而获得那些对象的内存,并能在移除这些缓项时能通知您的代码。

HttpRuntime.Cache还有个非常酷的功能是:它并非只能在Asp.net环境中使用,也能在其它编程模型中使用,比如大家熟知的WinForm编程模型。 如何使用呢,直接访问HttpRuntime.Cache这个静态属性肯定是不行的。我们只要在程序初始化时创建一个HttpRuntime的实例,当然还要保证它不会被GC回收掉。 然后就可以像在Asp.net中一样使用HttpRuntime.Cache了,就这么简单。是的,就是这样简单,您就可以在其它编程模型中使用Cache的强大功能: 线程安全的集合,2种过期时间的选择,缓存依赖,内存不足时自动释放且有回调通知。

可能还有人会担心往Cache里放入太多的东西会不会影响性能,因此有人还想到控制缓存数量的办法。我只想说: 缓存容器决定一个对象的保存位置是使用Hash算法的,并不会因为缓存项变多而影响性能,更有趣的是Asp.net的Cache的容器还并非只有一个, 它能随着CPU的数量而调整,看这个架式,应该在设计Cache时还想到了高并发访问的性能问题。

2.关于HttpRequest

作用:使ASP.NET能够读取客户端在Web请求期间发送的HTTP值。
HttpRequest的实例包含了所有来自客户端的所有数据,我们可以把这些数据看成是输入数据, Handler以及Module就相当于是处理过程,HttpResponse就是输出了

在HttpRequest包含的所有输入数据中,有我们经常使用的QueryString, Form, Cookie,它还允许我们访问一些HTTP请求头、 浏览器的相关信息、请求映射的相关文件路径、URL详细信息、请求的方法、请求是否已经过身份验证,是否为SSL等等。

HttpRequest的QueryString, Form属性的类型都是NameValueCollection,这个集合类型有一个特点:允许在一个键下【即同一个Name下】存储多个字符串值,如:

Response.Redirect(Request.RawUrl + "?aa=1&bb=2&cc=3&aa=" + HttpUtility.UrlEncode("5,6,7"), true); //此时,name为aa的值为1,5,6,7

3.关于HttpResponse

我们处理HTTP请求的最终目的只有一个:向客户端返回结果。而所有需要向客户端返回的操作都要调用HttpResponse的方法。 它提供的功能集中在操作HTTP响应部分,如:响应流,响应头。

4.关于HttpContext

HttpRequest, HttpResponse的实例的创建是在HttpContext中完成的

HttpContext.Current.Items:这是个字典,因此适合以Key/Value的方式来访问。如果希望在一次请求的过程中保存一些临时数据,那么,这个属性是最理想的存放容器了。 它会在下次请求重新创建【即:若想在Response.Redirect之后的目的page中访问源page中的HttpContext.Current.Items所存放的数据,是访问不了的,因为Response.Redirect引起了新的请求创建,而在新的请求里并没有在HttpContext.Current.Items存放数据,所以只适合用于单一请求中,且HttpContext.Current.Items中的内容在这次请求的整个过程中都是可见的,如:在HttpModules, HttpHandlers, Webforms, and Application events中,都是可见的,一旦这次请求结束,HttpContext.Current.Items中的内容就会消失】,因此,不同的请求之间,数据不会被共享。

HttpContext正是因为有个静态属性Current,所以在请求处理的任何阶段都可以找到它,即可以在任何地方访问Request, Response, Server, Cache, 还能在任何地方将一些与请求有关的临时数据保存起来,这绝对是个非常强大的功能。Module在不同的事件阶段,以及与Handler的”沟通“有时就通过这个方式来完成【用HttpContext.Current.Items来保存临时数据】。

由于可以到处可以访问到这些对象,导致如果乱用或滥用HttpContext.Current.XXXXX,将会使代码很难测试。原因很简单:在测试时,这些对象没法正常工作,因为HttpRuntime很多幕后的事情还没做,没有运行它们的环境。一般说来,很多人会采用三层或者多层的方式来组织他们的项目代码。此时,如果您希望您的核心代码是可测试的, 并且确实需要使用这些对象,那么应该尽量集中使用这些强大的对象,应该在最靠近UI层的地方去访问它们。

原文地址:https://www.cnblogs.com/notebook2011/p/2853290.html