ASP.NET本质论
上QQ阅读APP看书,第一时间看更新

1.4.2 处理回应的对象类型HttpResponse

为了向客户端返回请求的回应内容,同样定义代表回应的类型:HttpResponse类,它也定义在System.Web命名空间下,提供向客户端回应的方法和属性。一些常用的回应头以属性的形式提供程序员,方便了程序的编码。

public sealed class HttpResponse

这个类中定义了大量可以设置的属性和方法,见表1-7。

表1-7 HttpResponse常用属性和方法

回应对象用于向浏览器发回服务器处理的结果,这个结果就是HTTP协议中的回应消息。消息中包含三个部分的内容:状态行、头部、主体部分。

HttpResponse的StatusCode用于设置状态码,StatusDescription属性表示状态的描述信息。Status属性可以直接设置状态行的内容。

对于回应的头部,大多数常用的回应头在HTTPResponse中通过属性的方式表示出来,这样,就可以通过简单地设置属性的值,完成回应头的设置,例如:如果设置ContentType属性的值为text/html,在输出到HTTP的消息中对应的回应头如下:

Content-Type:text/html

对于没有对应属性的回应头,还可以通过AddHeader方法来处理。这个方法接收两个字符串类型的参数,一个回应头的名称,一个就是回应头所对应的值。方法的定义如下:

public void AppendHeader(
   string name,
   string value)

例如,在使用HTTP下载的时候,需要设置Content-Disposition回应头,但是,在HTTPResponse中并没有对应的属性,那么可以通过这个方法完成,如下所示:

this.Response.AddHeader(
"Content-Disposition", "attachment; filename=download.zip"
);

与HTTPRequest类似,HttpResponse也有一个名为Cookies的属性,但是,这个属性是用来回应到浏览器的Cookie的集合。每个加入到这个集合中的HttpCookie对象,将在回应头中生成一行如下的回应头:

set-Cookie:name=value

回应的内容部分是通过流来完成的,HttpResponse对象的OutputStream属性引用了输出到HTTP回应的输出流,这个属性定义如下:

public Stream OutputStream { get; }

由于在Web开发中,多数情况下,服务器处理的结果是一个文本网页,Output属性指向了一个经过包装的输出流,文本类型的输出流,这样我们可以非常简单地输出文本内容。Output属性的定义如下:

public TextWriter Output { get; }

对于文本内容,所使用的字符编码由属性 ContentEncoding决定,在HTTPResponse中的定义如下:

public Encoding ContentEncoding { get; set; }

需要注意的是,在HTTP的消息中,头部必须在主体部分的前面,所以,在已经输出主体部分之后,是不能再次输出消息头的。默认情况下,HttpResponse对输出的内容进行了缓冲,所以,通过HTTPResponse输出的内容并没有立即输出到HTTP中,还可以进行修改。这个时候,是可以在使用输出流之后再次设置回应头的。但是,如果关闭了HttpResponse的缓冲,那么,这样的操作将会出错。HttpResponse的BufferOutput属性是一个bool类型的属性,用于设置是否缓冲输出的内容。

HttpResponse还提供了一些特殊的方法,以直接返回某些特定的内容,例如请求的重定向,根据HTTP协议,服务器可以返回一个状态码为302的回应来通知浏览器应该向另外一个地址发出请求,回应头中的Location指出请求的地址。HttpResponse的Redirect方法可以帮助我们直接实现这个功能,我们仅仅需要将重定向的地址传送给Redirect方法,那么,HttpResponse返回一个状态码为302的回应,使浏览器重新向新的地址发出请求。