.net HttpResponse对象与HttpRequest对象用法

作者:袖梨 2022-06-25

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扩展传送大量字符串

 

httprequest对象包含了传入web请求的http数据包中包含的所有信息。http标头、查询字符串、表单的输入字段、路径和url信息的内容,被分别组织在不同的集合以及其他特殊对象中,能以编程方式便捷地访问。当asp.net开始处理web请求时,httprequest对象会被填充,并通过httpcontext的request属性暴露出来。

httprequest类的属性

  httprequest类的属性可被分为三类:请求类型、客户端数据和连接

有关请求的信息

  下表列出了有关请求信息的属性:

  httpbrowsercapabilities对象包含有关浏览器功能的大量信息,包括是否支持activex控件、脚本语言、框架和cookie等。当请求到达时,为确定发出请求的浏览器,会使用用户代理信息创建httpbrowsercapabilities类的实例,并用浏览器特定的信息进行填充。这些信息不是浏览器动态设置的,而是从服务器存储库中离线获取的。

 来自客户端的信息

  下表列出了httprequest描述客户端数据的属性:

  params集合结合了4个不同但形式相似的集合:querystring、form、servervariables、cookies,这与独立集合所包含的数据一致。该集合按以下次序填充:querystring、form、cookies、servervariables。

有关连接的信息

  下表列出了与打开连接有关的属性:

  uri类提供了统一资源标识符的对象表示。

httprequest类的方法

  下表列出了httprequest类的主要方法:

将请求保存至磁盘

  saveas方法使我们能创建存储http请求所有内容的文件。注意,存储介质只能是磁盘文件,而不能使用流和编写器。由于asp.net默认情况下不会被授予磁盘的写入权限,所以,为asp.net帐户授予新建文件(或文件夹)的完全访问权限,是saveas成功运行的条件之

相关文章

精彩推荐