ASP.NET 高級編程基礎第九篇—Response和Server對象
前言: 從這篇博客我們開始講解Response對象和Server對象的使用,Response對象和Server對象的使用也是很廣泛的,比如Response對象的輸出信息,Server對象讀取文件所在的位置等。
- Response對象
(1) 響應的緩衝輸入:爲了提高服務器的性能,ASP.NET向瀏覽器Write的時候默認並不會Write一次都會立即輸出到瀏覽器,而是會緩衝數據,到合適的時機或者響應結束纔會將緩衝區中的數據一起發送到瀏覽器端。
(2) Response對象的主要成員
1) Response.Buffer,Response.BufferOutput,進過Reflector反編譯,發現這兩個屬性是一樣的,Buffer內部就是調用的BufferOutput,這個屬性用來控制是否採用響應緩存,默認是true。
2) Response.Flush()將緩衝區中的數據發送給瀏覽器,這裏需要將write出來的內容立即輸出到瀏覽器的場合非常使用,案例:大批量數據的導入,顯示正在導入第幾條數據,用Thread.Sleep模擬耗時。
注:新建一個一般處理程序step.aspx,在其中寫入如下代碼:
1 context.Response.ContentType = "text/plain"; 2 3 for (int i = 0; i <= 20; i++) 4 5 { 6 7 System.Threading.Thread.Sleep(1000); 8 9 context.Response.Write("第" + i + "步執行完成<br/>"); 10 11 context.Response.Flush(); 12 13 //if (i == 10) 14 15 //{ 16 17 //context.Response.Clear(); 18 19 //} 20 21 }
3) Response.clear()清空緩衝區中的數據,這樣在緩衝區中的沒有發送到瀏覽器端的數據被清空,不會被髮送到瀏覽器,再用aspx輸出非HTML的例子中經常看到用Clear來輸出HttpModeld等。
注:新建一個WebFrom項目tupian.aspx,在其中寫入如下代碼:
1 protected void Page_Load(object sender, EventArgs e) 2 3 { 4 5 Response.ContentType = "image/JPEG"; 6 7 Response.Clear(); 8 9 string fullpath = Server.MapPath("菲.jpg"); 10 11 using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(fullpath)) 12 13 { 14 15 bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 16 17 } 18 19 }
4) Response.contentEncoding,輸出流的編碼
5) Response.ContentType輸出流的內容類型,比如是:html(text/html)還是普通文本(text/plain)還是JPEG圖片(image/JPEG)。
6) Response.Cookies返回給瀏覽器的Cookie的集合,可以通過它設置Cookie。
7) Response.OutPutStream輸出流,在輸出圖片,Excel文件等非文本內容的時候要使用它。
8) Response.End()終止響應,將之前緩衝中的數據發給瀏覽器,End()之後的代碼不會被繼續執行,在終止一些非法操作的時候,比如盜鏈等可以用End()立即終止請求。
注:添加一個EndTest.aspx項目,拖放一個DropDownList控件和Button控件,在Page_Load中寫入如下代碼:
1 protected void Page_Load(object sender, EventArgs e) 2 3 { 4 5 Response.Write("下面還有一句話"); 6 7 Response.End(); 8 9 Response.Write("cnblogs是我的最愛,你爲什麼不顯示的,哈哈"); 10 11 }
拖放在頁面上的所有控件也是不顯示的,只顯示第一句話。
9) Response.Redirect(Url)重定向瀏覽器到新的網址,既可以重定向到站外網址也可以重定向到站內網址,Response.Redirect(“http://www.baidu.com”),Response.Redirect(“a.html”),Redirect是向瀏覽器發回302重定向,是通知”瀏覽器”請重新訪問訪問URL這個網址,這個過程經歷了服務器通知瀏覽器”請重新訪問url這個網址”和瀏覽器接到命令訪問新網址的過程,使用HttpWatch查看整個響應過程的Http報文。用Redirect因爲是瀏覽器自己去重新訪問新網址的,所以在地址欄中可以看到網址的的變化,後面會用來防止刷新瀏覽器時提示”重試”。
注:檢測信息的時候能夠在地址欄中輸入?q=1模擬。
1 protected void Page_Load(object sender, EventArgs e) 2 3 { 4 5 string q = Request["q"]; 6 7 if (q == "1") 8 9 { 10 11 Response.Write("我是韓迎龍"); 12 13 } 14 15 else if (string.IsNullOrEmpty(q)) 16 17 { 18 19 Response.Write("你怎麼能是空的呢"); 20 21 } 22 23 else 24 25 { 26 27 Response.Write("恭喜你啦"); 28 29 } 30 31 }
10) Response.SetCookie(HttpCookie cookie),向輸出流中更新寫到瀏覽器中的Cookie,如果Cookie存在就更新,不存在就增加,是對Response.Cookies的簡化調用。
11) Response.Write() 想瀏覽器輸出內容。
12) Response.WriteFile(fileName) 向瀏覽器輸出文件,比如:Response.WriteFile(“c:/root.ini”).
注:在step.ashx中寫入如下代碼:
1 context.Response.ContentType = "Image/JPEG"; 2 3 string full = context.Server.MapPath("菲.jpg"); 4 5 context.Response.WriteFile(full);
- Server對象
(1) Server是context的一個屬性,是HttpServerUtility類的一個對象。
(2) Server.HtmlDecode(),Server.HtmlEncode(),Server.UrlEncode(),Server.UrlDecode()是對HttpUtility類中相應方法的一個代理調用,個人推薦總是使用HttpUtility,因爲有的地方很難拿到Server對象,別把HtmlEncode,UrlEncode混淆了,UrlEncode是處理超鏈接的,HtmlEncode是處理Html代碼的。
(3) Server.Transfer(path)內部重定向請求,Server.Transfer(“step.aspx”)將用戶的請求重定向到step.aspx處理,是服務器內部的接管,瀏覽器是意識不到這個接管的,不像Response.redirect()那樣經歷”通知瀏覽器請重新訪問url這個地址”和”瀏覽器接到命令訪問新網址的過程”。因此瀏覽器地址欄不會變化,因爲是內部接管,所以在被重定向到的頁面中是可以訪問到Redirect,Cookies等這些來源頁面接受的參數的,就像這些參數是傳遞給他的,而Redirect則是不行的,因爲是讓瀏覽器去訪問的,注意Transfer是內部接管,因此不能像Redirect那樣重定向到外部網站。
注:新建一個hello.aspx頁面,在redirect.aspx.cs頁面中再加入如下代碼:
else if (q == "2")
{
Server.Transfer("hello.aspx");
}
在Hello.aspx.cs的page_load頁面中寫入如下信息:
Response.Write(Request["q"]);
(4) 使用Server.Transefer不能直接從定向到ashx,否則會報錯”執行請求出錯”。
(5) 有時候不能拿到HttpContext對象,比如在:Global.ascx中,可以通過HttpContext.Current拿到當前的HttpContext,進而取得Response.Request.Server等。