您的位置:首页 > 理论基础 > 计算机网络

ASP.NET 3.5核心编程学习笔记(30):HttpResponse对象

2011-04-24 01:37 609 查看
  在ASP.NET中,HTTP响应信息由HttpResponse类进行封装。该类的实例创建于处理请求的HTTP管道建立时,之后该实例被链接到与请求关联的HttpContext对象,通过其Response属性暴露。虽然用户定义的ASP.NET代码不需使用HttpResponse的构造函数,但此函数可帮助我们理解该类的本质:

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能使大型文件的下载更稳定,但它不支持断点续传。如果由于某种原因下载失败,只能重头开始传输。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐