ASP.NET 3.5核心编程学习笔记(30):HttpResponse对象
2011-04-24 01:37
609 查看
在ASP.NET中,HTTP响应信息由HttpResponse类进行封装。该类的实例创建于处理请求的HTTP管道建立时,之后该实例被链接到与请求关联的HttpContext对象,通过其Response属性暴露。虽然用户定义的ASP.NET代码不需使用HttpResponse的构造函数,但此函数可帮助我们理解该类的本质:
可以看出,该构造函数接受一个TextWriter对象,该对象用于存储响应文本。对Response.Write的调用都被转换为对TextWriter对象的调用。
HttpResponse类的属性
下表列出了HttpResponse类的属性:
响应缓存策略的设置
对于发往浏览器且被缓存的页面,响应对象有三个控制属性。Expries和ExpriesAbsolute属性分别用于定义相对时间和绝对时间。届时,在客户端缓存的页面会过期,浏览器不再使用它来为客户的请求服务。事实上,如果用户导航到当前被缓存的页面,缓存版本会被显示出来,而不会与服务器进行交互。与缓存有关的第三个属性是CacheControl。该属性用于设置一个特殊的HTTP标头,即Cache-Control。该标头用于控制文档在网络间的缓存方式。这些属性赌注是旧式的ASP编程风格。
在ASP.NET中,所有缓存功能由HttpCachePolicy类来设置。对于页面的缓存,该类扮演着双重角色。该类提供的方法,有的用于设置缓存特定的HTTP标头,有的用于控制ASP.NET页面输出缓存。
为设置客户端缓存中页面的可见性,可使用HttpCachePolicy类的SetCacheability方法。SetExpires方法用于设置过期时间,该方法接受一个绝对的DateTime对象。若要设置缓存页面的生存期,将当前时间加上预期间隔,并传入SetExpires即可。
若发生缓存策略冲突,ASP.NET会采用限制最强的设置。例如,如果页面包含两个控件,分别将Cache-Control标头设置为Public和Private,则会采用限制最强的策略。本例中,Cache-Control:Private会被发往客户端。
输出筛选器的设置
响应筛选器是一种派生自Stream的对象,与HttpResponse对象相关联。该对象能对页面的输出进行监视和筛选。如果将Filter属性设置为派生自Stream类的实例,那么所有将要写入底层HTTP编写器的输出会事先通过该输出筛选器。
如果设置了自定义的筛选器,那么它将在HttpResponse的Flush方法执行期间且在实际文本发送给客户端之前调用。输出筛选器适合于对标记做最后的处理,往往用于对控件生成的标记进行压缩或修正。
构建响应筛选器是指创建一个新的流派生类,并重写其中的某些方法。该类应该有一个接受Stream对象的构造函数。因此,响应筛选器类不仅是一个继承于流的类,还是一个包装器类。如果将MemoryStream或FileStream这样的类实例直接赋给Response.Filter,则会有异常输出。
下面的代码演示了如何创建充当响应筛选器的流类。为简单起见,该类继承于MemoryStream。该类能将小写字母转换为大写。
通过下面的代码便可将输出筛选器与Response.Filter属性关联:
响应筛选器有利于开发者构建功能强大的应用程序,但选用这种方式必须谨慎。如果使用不慎,将对视图状态和内部脚本代码(二者都可能包含区分大小写的文本)产生影响,从而严重危及页面输出效果。
还要注意,必须针对单个页面启用筛选器。如果需要筛选网站中所有页面,最好编写HTTP模块。
HttpResponse类的方法
下表列出了所有HttpResponse类的方法:
大型文件的传输
HttpResponse类中有三个能够将大型文件定入输出流中的方法:BinaryWrite、WriteFile、TransmitFile。TransmitFile方法是这三个方法中最稳定、最可靠的。
在传输大型文件时,WriteFile和BinaryWrite方法会对Web服务器的内存造成压力。为什么会这样呢?因为这两个方法要将整个数据块(文件或字节数组的内容)加载到Web服务器的内存中。对于大型文件,这会造成严重的内存问题,迫使ASP.NET进行自身被回收。TransmitFile方法旨在优雅地解决这个问题,该方法能够将输出从文件直接发送到ASP.NET ISAPI扩展,随后下载到客户端,而不用向ISAPI扩展传送大量字符串。
虽然TransmitFile能使大型文件的下载更稳定,但它不支持断点续传。如果由于某种原因下载失败,只能重头开始传输。
public HttpResponse(TextWriter writer);
可以看出,该构造函数接受一个TextWriter对象,该对象用于存储响应文本。对Response.Write的调用都被转换为对TextWriter对象的调用。
HttpResponse类的属性
下表列出了HttpResponse类的属性:
响应缓存策略的设置
对于发往浏览器且被缓存的页面,响应对象有三个控制属性。Expries和ExpriesAbsolute属性分别用于定义相对时间和绝对时间。届时,在客户端缓存的页面会过期,浏览器不再使用它来为客户的请求服务。事实上,如果用户导航到当前被缓存的页面,缓存版本会被显示出来,而不会与服务器进行交互。与缓存有关的第三个属性是CacheControl。该属性用于设置一个特殊的HTTP标头,即Cache-Control。该标头用于控制文档在网络间的缓存方式。这些属性赌注是旧式的ASP编程风格。
在ASP.NET中,所有缓存功能由HttpCachePolicy类来设置。对于页面的缓存,该类扮演着双重角色。该类提供的方法,有的用于设置缓存特定的HTTP标头,有的用于控制ASP.NET页面输出缓存。
为设置客户端缓存中页面的可见性,可使用HttpCachePolicy类的SetCacheability方法。SetExpires方法用于设置过期时间,该方法接受一个绝对的DateTime对象。若要设置缓存页面的生存期,将当前时间加上预期间隔,并传入SetExpires即可。
若发生缓存策略冲突,ASP.NET会采用限制最强的设置。例如,如果页面包含两个控件,分别将Cache-Control标头设置为Public和Private,则会采用限制最强的策略。本例中,Cache-Control:Private会被发往客户端。
输出筛选器的设置
响应筛选器是一种派生自Stream的对象,与HttpResponse对象相关联。该对象能对页面的输出进行监视和筛选。如果将Filter属性设置为派生自Stream类的实例,那么所有将要写入底层HTTP编写器的输出会事先通过该输出筛选器。
如果设置了自定义的筛选器,那么它将在HttpResponse的Flush方法执行期间且在实际文本发送给客户端之前调用。输出筛选器适合于对标记做最后的处理,往往用于对控件生成的标记进行压缩或修正。
构建响应筛选器是指创建一个新的流派生类,并重写其中的某些方法。该类应该有一个接受Stream对象的构造函数。因此,响应筛选器类不仅是一个继承于流的类,还是一个包装器类。如果将MemoryStream或FileStream这样的类实例直接赋给Response.Filter,则会有异常输出。
下面的代码演示了如何创建充当响应筛选器的流类。为简单起见,该类继承于MemoryStream。该类能将小写字母转换为大写。
public class MyFilterStream : MemoryStream { private Stream m_Stream; public MyFilterStream(Stream filterStream) { m_Stream = filterStream; } //the write method actually does the filtering public override void Write(byte[] buffer, int offset, int count) { //Grab the output as a string string buf = UTF8Encoding.UTF8.GetString(buffer, offset, count); //Change lowercase chars to uppercase buf = buf.ToUpper(); //Write the resulting string back the response stream byte[] data = UTF8Encoding.UTF8.GetBytes(buf.ToString()); m_Stream.Write(data, 0, data.Length); } }
通过下面的代码便可将输出筛选器与Response.Filter属性关联:
void Page_Load(object sender, EventArgs e) { Response.Filter = new MyFilterStream(Response.Filter); }
响应筛选器有利于开发者构建功能强大的应用程序,但选用这种方式必须谨慎。如果使用不慎,将对视图状态和内部脚本代码(二者都可能包含区分大小写的文本)产生影响,从而严重危及页面输出效果。
还要注意,必须针对单个页面启用筛选器。如果需要筛选网站中所有页面,最好编写HTTP模块。
HttpResponse类的方法
下表列出了所有HttpResponse类的方法:
大型文件的传输
HttpResponse类中有三个能够将大型文件定入输出流中的方法:BinaryWrite、WriteFile、TransmitFile。TransmitFile方法是这三个方法中最稳定、最可靠的。
在传输大型文件时,WriteFile和BinaryWrite方法会对Web服务器的内存造成压力。为什么会这样呢?因为这两个方法要将整个数据块(文件或字节数组的内容)加载到Web服务器的内存中。对于大型文件,这会造成严重的内存问题,迫使ASP.NET进行自身被回收。TransmitFile方法旨在优雅地解决这个问题,该方法能够将输出从文件直接发送到ASP.NET ISAPI扩展,随后下载到客户端,而不用向ISAPI扩展传送大量字符串。
虽然TransmitFile能使大型文件的下载更稳定,但它不支持断点续传。如果由于某种原因下载失败,只能重头开始传输。
相关文章推荐
- ASP.NET 3.5核心编程学习笔记(44):HTTP处理程序的编写之从数据库加载图像
- ASP.NET 3.5核心编程学习笔记(43):HTTP处理程序的编写之图片查看器
- ASP.NET 3.5核心编程学习笔记(41):HTTP处理程序与HTTP模块
- ASP.NET 3.5核心编程学习笔记(32):HttpApplicationState
- ASP.NET 3.5核心编程学习笔记(46):HTTP模块的编写
- ASP.NET 3.5核心编程学习笔记(28):HttpContext类
- ASP.NET 3.5核心编程学习笔记(26):HttpApplication对象
- ASP.NET 3.5核心编程学习笔记(31):HttpRequest对象
- ASP.NET 3.5核心编程学习笔记(42):HTTP处理程序的编写之建立数据报表
- ASP.NET 3.5核心编程学习笔记(45):HTTP处理程序之高级编程
- ASP.NET 3.5核心编程学习笔记(22):LINQ与SQL的交互、延迟加载与预加载
- ASP.NET 3.5核心编程学习笔记(36):页面的视图状态和控件状态
- ASP.NET 3.5核心编程学习笔记(52):Microsoft AJAX JavaScript类库
- ASP.NET 3.5核心编程学习笔记(2):Page类
- ASP.NET 3.5核心编程学习笔记(4):服务器控件简介
- ASP.NET 3.5核心编程学习笔记(19):数据源组件、SqlDataSource控件
- ASP.NET 3.5核心编程学习笔记(27):global.asax文件
- ASP.NET 3.5核心编程学习笔记(34):会话状态的使用
- ASP.NET 3.5核心编程学习笔记(37):缓存的使用
- ASP.NET 3.5核心编程学习笔记(38):自定义缓存依赖