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能使大型文件的下载更稳定,但它不支持断点续传。如果由于某种原因下载失败,只能重头开始传输。