获取与该 Page 对象关联的 HttpResponse 对象。该对象使您得以将 HTTP 响应数据发送到客户端,并包含有关该响应的信息。
一、HttpResponse 类
封装来自 ASP.NET 操作的 HTTP 响应信息。
HttpResponse 类型公开以下成员。
构造函数
名称 |
说明 |
HttpResponse |
基础结构。初始化 HttpResponse 类的新实例。 |
方法
名称 |
说明 |
AddCacheDependency |
将一组缓存依赖项与响应关联,这样,如果响应存储在输出缓存中并且指定的依赖项发生变化,就可以使该响应失效。 |
AddCacheItemDependencies |
已重载。 使缓存响应的有效性依赖于缓存中的其他项。 |
AddCacheItemDependency |
使缓存响应的有效性依赖于缓存中的其他项。 |
AddFileDependencies |
已重载。 使缓存响应的有效性依赖于缓存中的其他项。 |
AddFileDependency |
将单个文件名添加到文件名集合中,当前响应依赖于该集合。 |
AddHeader |
将一个 HTTP 标头添加到输出流。提供 AddHeader 是为了与 ASP 的先前版本保持兼容。 |
AppendCookie |
基础结构。将一个 HTTP Cookie 添加到内部 Cookie 集合。 |
AppendHeader |
将 HTTP 头添加到输出流。 |
AppendToLog |
将自定义日志信息添加到 Internet 信息服务 (IIS) 日志文件。 |
ApplyAppPathModifier |
如果会话使用 Cookieless 会话状态,则将该会话 ID 添加到虚拟路径中,并返回组合路径。如果不使用 Cookieless 会话状态,则 ApplyAppPathModifier 返回原始的虚拟路径。 |
BinaryWrite |
将一个二进制字符串写入 HTTP 输出流。 |
Clear |
清除缓冲区流中的所有内容输出。 |
ClearContent |
清除缓冲区流中的所有内容输出。 |
ClearHeaders |
清除缓冲区流中的所有头。 |
Close |
关闭到客户端的套接字连接。 |
DisableKernelCache |
禁用当前响应的内核缓存。 |
End |
将当前所有缓冲的输出发送到客户端,停止该页的执行,并引发 EndRequest 事件。 |
Equals |
确定指定的 Object 是否等于当前的 Object。 (继承自 Object。) |
Finalize |
允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。 (继承自 Object。) |
Flush |
向客户端发送当前所有缓冲的输出。 |
GetHashCode |
用作特定类型的哈希函数。 (继承自 Object。) |
GetType |
获取当前实例的 Type。 (继承自 Object。) |
MemberwiseClone |
创建当前 Object 的浅表副本。 (继承自 Object。) |
Pics |
将一个 HTTP PICS-Label 标头追加到输出流。 |
Redirect |
已重载。 将客户端重定向到新的 URL。 |
RemoveOutputCacheItem |
从缓存中移除与指定路径关联的所有缓存项。此方法是静态的。 |
SetCookie |
基础结构。更新 Cookie 集合中的一个现有 Cookie。 |
ToString |
返回表示当前 Object 的 String。 (继承自 Object。) |
TransmitFile |
已重载。 将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件。 |
Write |
已重载。 将信息写入 HTTP 响应输出流。 |
WriteFile |
已重载。 将指定的文件直接写入 HTTP 响应输出流。 |
WriteSubstitution |
允许将响应替换块插入响应,从而允许为缓存的输出响应动态生成指定的响应区域。 |
属性
名称 |
说明 |
Buffer |
获取或设置一个值,该值指示是否缓冲输出并在处理完整个响应之后发送它。 |
BufferOutput |
获取或设置一个值,该值指示是否缓冲输出并在处理完整个页之后发送它。 |
Cache |
获取网页的缓存策略(例如:过期时间、保密性设置和变化条款)。 |
CacheControl |
获取或设置与 HttpCacheability 枚举值之一匹配的 Cache-Control HTTP 标头。 |
Charset |
获取或设置输出流的 HTTP 字符集。 |
ContentEncoding |
获取或设置输出流的 HTTP 字符集。 |
ContentType |
获取或设置输出流的 HTTP MIME 类型。 |
Cookies |
获取响应 Cookie 集合。 |
Expires |
获取或设置在浏览器上缓存的页过期之前的分钟数。如果用户在页面过期之前返回同一页,则显示缓存的版本。提供 Expires 是为了与 ASP 的先前版本保持兼容。 |
ExpiresAbsolute |
获取或设置从缓存中移除缓存信息的绝对日期和时间。提供 ExpiresAbsolute 是为了与 ASP 的先前版本保持兼容。 |
Filter |
获取或设置一个包装筛选器对象,该对象用于在传输之前修改 HTTP 实体主体。 |
HeaderEncoding |
获取或设置一个 Encoding 对象,该对象表示当前标头输出流的编码。 |
Headers |
获取响应标头的集合。 |
IsClientConnected |
获取一个值,通过该值指示客户端是否仍连接在服务器上。 |
IsRequestBeingRedirected |
获取一个布尔值,该值指示客户端是否正在被传输到新的位置。 |
Output |
启用到输出 HTTP 响应流的文本输出。 |
OutputStream |
启用到输出 HTTP 内容主体的二进制输出。 |
RedirectLocation |
获取或设置 Http Location 标头的值。 |
Status |
设置返回到客户端的 Status 栏。 |
StatusCode |
获取或设置返回给客户端的输出的 HTTP 状态代码。 |
StatusDescription |
获取或设置返回给客户端的输出的 HTTP 状态字符串。 |
SubStatusCode |
获取或设置一个限定响应的状态代码的值。 |
SuppressContent |
获取或设置一个值,该值指示是否将 HTTP 内容发送到客户端。 |
TrySkipIisCustomErrors |
获取或设置一个值,该值指定是否禁用 IIS 7.0 自定义错误。 |
二、Request对象的常用成员说明
Request用于回应浏览器,告诉浏览器回应内容的报头、服务器的状态信息和输出指定的内容。
(1) Response.ContentType = "text/html"
设定输出内容的类型。
字符串格式为type/subtype,type表示内容的分类,subtype则表示特定内容类型,再如"image/gif"
(2) Response.Clear()方法
删除所有缓存中的HTML输出。但此方法只删除Response显示输出信息,不删除response头信息。
(3) Response.ClearContent()方法
不仅像Clear()方法那样删除Response显示输出信息,而且还删除Response头信息。
(4) Response.ClearHeader()方法
仅删除Response头信息
(5) Response.Expires=number
设定页面在浏览器Cache中失效的时间长度(单位为分钟),如果用户在其失效之前返回到同一个画面,则显示Cache中的页面。
(6) Response.ExpiresAbsolute=DateTime
设定页面在浏览器Cache中失效的具体时间。例:Response.ExpiresAbsolute=DateTime.Now,表示马上过期。
(7) Response.Buffer=bool
设定页面是否进行缓冲。默认是True。
如有缓冲,则服务器在当前处理的页面上的语句被处理之前,不将Response语句发送给客户端,除非有Flush()或End()方法调用。
(8) Response.Flush()方法
立即将缓区中的页面输出。
(9) Response.End()方法
使Web服务器停止当前的程序并返回结果,剩下的文件内容是没有处理的。
(10) Response.Write()方法
输出指定的文本内容。例:Response.Write("Hello!")
(11) Response.BinaryWrite()方法
将指定的信息不进行字符转换,直接写到当前的HTTP输出。此方法可用来自来非字符数据,如某些应用程序要求的二进制数据。
(12) Response.WriteFile()方法
直接将输出内容写入一个文件。例:Response.WriteFile("D://abc.txt")
注:写入的文件在写入之前必须存在。
三、用Response对象输出图像
1、、简介
作为ASP.NET基本对象之一的Response对象不但可以通过Write()方法直接在页面上输出字符串数据,而且还可以使用BinaryWrite()方法直接显示二进制表示的数据,如图像、图片等。
本文示例小工程将向你展示如何使用Response对象在ASP.NET 2.0 Web页面中输出直接存储在SQL Server 2005数据库中的图像数据。
【注意】在本例中,我们没有讨论仅在SQL Server 2005表格中存储图像的URL的情形。因为这种情形是实际开发中被广为采用的方法,所以,读者不难在Web上搜到相应的使用案例。
首先,让我们来分析一个简单的直接在Web页面上绘制并输出图像数据的例子。
2、直接在Web页面上绘制并输出图像数据
下面的代码示例在请求页面时将绘制三个部分重叠的矩形。该代码首先将ContentType属性设置为image/jpeg,以便将整个页面呈现为一幅JPEG图像。第二步,该代码调用Clear方法以确保不会将无关的内容(包括标头)与此响应一同发送。第三步,该代码将BufferOutput属性设置为true,从而使该页面在完全处理之后再发送到发出请求的客户端。第四步,创建两个用于绘制矩形的对象,即Bitmap和Graphics对象。在该页中创建的变量将作为绘制矩形的坐标和在最大的矩形中显示的字符串。
在绘制三个矩形和其中显示的字符串时,将Bitmap保存到与OutputStream属性相关联的Stream对象中,并将其格式设置为JPEG。接下来,该代码调用Dispose和Dispose方法来释放资源—这些资源为两个绘制对象所使用。最后,该代码调用Flush方法将缓冲的响应发送到请求客户端。
完整的实现代码如下所示:
<%@ Page Language="C#" %> <%@ import Namespace="System.Drawing" %> <%@ import Namespace="System.Drawing.Imaging" %> <%@ import Namespace="System.Drawing.Drawing2D" %> <script runat="server"> private void Page_Load(object sender, EventArgs e) { //设置页面的content type为JPEG文件 //并且清除所有的响应头部信息 Response.ContentType = "image/jpeg"; Response.Clear(); //对响应作出缓冲以便处理完成后发送页面 Response.BufferOutput = true; //创建一字体风格 Font rectangleFont = new Font( "Arial", 10, FontStyle.Bold); //创建整数变量 int height = 100; int width = 200; //创建一个随机数字生成器并且基于它创建 //变量值 Random r = new Random(); int x = r.Next(75); int a = r.Next(155); int x1 = r.Next(100); //创建一张位图并且使用它创建一个 //Graphics对象 Bitmap bmp = new Bitmap( width, height, PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(bmp); g.SmoothingMode = SmoothingMode.AntiAlias; g.Clear(Color.LightGray); //使用这个Graphics对象绘制3个矩形 g.DrawRectangle(Pens.White, 1, 1, width-3, height-3); g.DrawRectangle(Pens.Aquamarine, 2, 2, width-3, height-3); g.DrawRectangle(Pens.Black, 0, 0, width, height); //使用这个Graphics对象输出一个字符串 // on the rectangles. g.DrawString( "ASP.NET Samples", rectangleFont, SystemBrushes.WindowText, new PointF(10, 40)); //在其中两个矩形上添加颜色 g.FillRectangle( new SolidBrush( Color.FromArgb(a, 255, 128, 255)), x, 20, 100, 50); g.FillRectangle( new LinearGradientBrush( new Point(x, 10), new Point(x1 + 75, 50 + 30), Color.FromArgb(128, 0, 0, 128), Color.FromArgb(255, 255, 255, 240)), x1, 50, 75, 30); //把位图保存到响应流中并且把它转换成JPEG格式 bmp.Save(Response.OutputStream, ImageFormat.Jpeg); //释放掉Graphics对象和位图所使用的内存空间 g.Dispose(); bmp.Dispose(); //把输出结果发送到客户端 Response.Flush(); } </script> <html> <head> </head> <body> <form runat="server"> </form> </body> </html> |
接下来,让我们讨论本文重点—如何在ASP页面中输出直接存储在数据库中的图像数据。
3、事件设计
示例工程中的DispImage.aspx页面在其初始化函数Page_Load(object sender,EventArgs e)中使用Response对象输出一幅图像—该图像存储在SQL Server 2005 Express Edition数据库中,并用二进制表示。
在代码中,我们首先从数据库PictureDB的表格PictureTab中获取一个ID值为1的图片,然后使用byte数组Data保存图片的数据。然后,我们可以基于如下步骤来输出相应的图像:
1. 设置Response对象的输出类型;
2. 输出图像的文件头;
3. 输出图像的二进制数据;
4. 结束输出。如果图片太大,还可以使用输出缓冲的方法。
函数Page_Load(object sender,EventArgs e)的程序代码如下:
protected void Page_Load(object sender,EventArgs e) { ///创建链接 SqlConnection myConnection = new SqlConnection( ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString); ///定义SQL语句 string cmdText = "SELECT * FROM PictureTab WHERE PictureID='1'"; ///创建Command SqlCommand myCommand = new SqlCommand(cmdText,myConnection); ///定义DataReader SqlDataReader dr = null; try { ///打开链接 myConnection.Open(); ///读取数据 dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection); } catch(SqlException ex) { ///抛出异常 throw new Exception(ex.Message,ex); } ///定义保存数据的字节数组 byte[] Data = null; while(dr.Read()) { ///读取数据 Data = (byte[])dr["Data"]; Response.ContentType = dr["Type"].ToString(); } dr.Close(); //显示图片数据 this.EnableViewState = false; ///输出文件头 Response.AppendHeader("Content-Length",Data.Length.ToString()); ///输出文件的数据 Response.BinaryWrite(Data); ///结束输出 Response.End(); } |
4、附注与小结
把上面的页面DispImage.aspx设置为初始页面,然后运行上面的示例工程。此时,页面上应该显示一张存储在数据库表格中的图片。
在实践中,有些情况下需要把图像数据直接存储在数据库中;而有些情况下只在数据库存储图像文件的URL而把实际图像文件存储在服务器文件系统中则更好。从性能上看,将这种大型数据存储为文件肯定要快一些,而且图形人员能够更为容易地访问图像并对其编辑。然而,当需要在不同机器间移动数据库时,将这种大型数据存储为文件就会面临最棘手的问题,因为文件很容易断开与数据库的连接。因此,如果将其直接存储在数据库中则明显可以使数据保持轻松的同步。总之,各有利弊,需慎重做出选择。