Download presentation
Presentation is loading. Please wait.
1
第4章 ASP.NET的HTTP物件、輸出入與Cookie處理
4-1 HTTP通訊協定的特性 4-2 HTTP物件與Server物件 4-3 基本輸出的Response物件 4-4 基本輸入的Request物件 4-5 Cookies的處理 4-6 伺服器與瀏覽程式資訊 4-7 Include指令的使用 4-8 ASP.NET程式的除錯
2
4-1 HTTP通訊協定的特性-標頭 HTTP通訊協定的標頭
HTTP通訊協定傳送的資料並不是只有網址,在HTTP「標頭」(Header)資訊儲存有瀏覽程式版本、時間和表單欄位等資料。 Web伺服器在處理瀏覽程式請求時,首先檢查網頁是否存在,接著處理HTTP標頭,依照副檔名判斷是否為ASP.NET程式,如果是,就編譯且執行它,並且將標頭傳送給ASP.NET程式。
3
4-1 HTTP通訊協定的特性-特性 HTTP通訊協定的特性
HTTP是一種在Client/Server架構傳送資料的通訊協定,其特性如下所示: HTTP通訊協定並不會持續保持連接:當瀏覽程式提出請求時,才會建立連接,在請求後就斷線等待回應,每一次請求和回應都需要先建立連線。 HTTP通訊協定不會保留狀態:因為HTTP通訊協定並不會保持連線,所以連線時,伺服端和客戶端互相知道對方,一旦請求結束,就互不相干。 HTTP通訊協定與資料型態無關:任何種類的資料型態,都可以透過HTTP通訊協定來傳送。
4
4-2 HTTP物件與Server物件 4-2-1 HTTP物件的說明 4-2-2 Server物件的屬性
5
4-2-1 HTTP物件的說明-1 Response物件:即HttpResponse類別,可以輸出網頁內容的標籤或處理Cookies,然後送到瀏覽程式顯示,或是控制網頁轉址,從一頁網頁轉址至其他網頁。 Request物件:即HttpRequest類別,可以讀取表單欄位送出的資料或URL參數、Cookies和取得伺服器的變數。 Server物件:即HttpServerUtility類別,可以建立COM物件、執行其他ASP.NET程式和HTML和處理URL編碼。
6
4-2-1 HTTP物件的說明-2 Application物件:即HttpApplicationState類別,瀏覽網站的所有使用者都可以透過此物件取得一些共享資料。例如:網站的訪客計數。 Session物件:即System.Web.SessionState名稱空間的HttpSessionState類別,對於瀏覽網站的每位使用者,可以使用此物件保留使用者的專屬資料。例如:使用者登入網站的使用者名稱(Username)和密碼(Password)。
7
4-2-2 Server物件的屬性 Server物件的屬性可以取得Web伺服器名稱,和設定或取得逾時時間,其相關屬性如下表所示:
8
4-2-3 Server物件的方法-Server.MapPath()方法
Server.MapPath()方法可以將伺服器的虛擬路徑,轉換為實際硬碟的檔案路徑。例如:使用Server.MapPath()方法取得指定ASP.NET程式的實際路徑,其程式碼如下所示: Dim path As String path = Server.MapPath("/Ch04/Ch4-2-2.aspx") 程式碼取得網站Ch4-2-2.aspx的實際路徑。除了檔案外,我們也可以取得虛擬目錄的實際路徑。例如:取得Web伺服器虛擬目錄的實際路徑,如下所示: path1 = Server.MapPath("/") path2 = Server.MapPath("/Ch04")
9
4-2-3 Server物件的方法-Server.CreateObject()方法
Server.CreateObject()方法可以在伺服端建立COM元件。例如:舊版ASP的FileSystemObject物件,就可以使用CreateObject()方法來建立物件,如下所示: <% Dim fso, file As Object Dim str As String ' 建立FileSystemObject物件 fso = Server.CreateObject("Scripting.FileSystemObject") file = fso.OpenTextFile( _ Server.MapPath("Ch4-2-3.txt"), 1, False) str = file.ReadAll() ' 讀取檔案內容 Response.Write("檔案內容: " & str & "<br>") %>
10
4-2-3 Server物件的方法-Server.Transfer()方法
Response.Redirect()方法浪費相當多頻寬在瀏覽程式和Web伺服器間的通訊,Server.Transfer()方法的轉址操作完全在Web伺服器完成,並不會浪費頻寬,其使用方式和Response.Redirct()幾乎相同,如下所示: Server.Transfer("Ch4-2-2.aspx")
11
4-2-3 Server物件的方法-Server.Execute()方法
Server.Execute()方法有些像在主程式呼叫副程式,當轉址ASP.NET程式執行完成後,還會回到呼叫轉址的ASP.NET程式。例如:ASP.NET程式Ch4-2-3Execute.aspx的程式碼,如下所示: Response.Write("ASP.NET 2.0的") Server.Execute("Ch4-2-3Sub.aspx") Response.Write("提供的轉址功能<p>") 程式碼可以轉址至ASP.NET程式Ch4-2-3Sub.aspx,其程式碼如下所示: Response.Write("Server物件")
12
4-2-3 Server物件的方法- Server.HtmlEncode()和HtmlDecode()方法
Server.HtmlEncode()方法可以將指定字串使用HTML編碼方式進行編碼,然後配合Server.HtmlDecode()方法進行解碼,如下所示: Dim str As String str = "<p>ASP.NET 2.0網頁製作徹底研究</p>" str = Server.HtmlEncode(str) ' 編碼 Response.Write(str & "<br>") str = Server.HtmlDecode(str) ' 解碼
13
4-2-3 Server物件的方法- Server.UrlEncode()和UrlDecode()方法
Server.UrlEncode()方法可以將指定字串使用URL編碼方式來進行編碼,如果URL參數需要傳遞特殊符號。例如:「#」、「?」和「&」等字元,就需要使用此方法進行編碼處理,如下所示: <a href="Ch4-2-3Url.aspx?name=陳會安? & #">沒有編碼</a> <a href="Ch4-2-3Url.aspx?name= <%=Server.UrlEncode("陳會安? & #")%>"> 有編碼</a>
14
4-3 基本輸出的Response物件 4-3-1 輸出網頁到瀏覽程式 4-3-2 輸出圖片到瀏覽程式 4-3-3 緩衝區的處理
4-3-4 IIS輸出與瀏覽程式快取的控制
15
4-3-1 輸出網頁到瀏覽程式-Response.Write()方法1
Response.Write()方法可以將任何資料型態的資料,輸出到瀏覽程式顯示,換句話說,就是輸出成HTML標籤,如下所示: Dim str As String = "星期三" Response.Write("<center><h2>我的首頁</h2></center>") Response.Write("<hr>") Response.Write("<p>今天是: " & str &"</p>")
16
4-3-1 輸出網頁到瀏覽程式-Response.Write()方法2
另一種方式是保留HTML標籤,只是在標籤需要取代的部分輸出變數值,其程式碼如下所示: <p>今天是: <%= str%></p> 程式碼是Response.Write()方法的簡化寫法。換句話說,透過Response.Write()方法,就能夠依照程式碼輸出所需的網頁內容。
17
4-3-1 輸出網頁到瀏覽程式-Response.Redirect()方法
Response.Redirect()方法可以將網頁轉址到其他的URL網址或網頁,因為會轉址到其他網頁,所以網頁內容並沒有顯示機會,其他多餘的HTML標籤都可以刪除掉,如下所示: <% Response.Redirect("Ch4-3-1Write.aspx") %>
18
4-3-2 輸出圖片到瀏覽程式- Response.ContentType屬性
HTTP通訊協定基本上與資料型態無關,不過在傳送資料前,我們可以指定資料型態,即ContentType屬性,如下所示: Response.ContentType = "image/gif" 程式碼指定網頁內容是GIF圖檔。
19
4-3-2 輸出圖片到瀏覽程式- Response.BinaryWrite()方法
當HTTP通訊協定傳送內容設定成圖片等二進位資料時,我們並不是使用Write()方法,而是使用BinaryWrite()方法來輸出二進位資料,如下所示: Dim buffer(objStream.Length) As Byte ' 讀取圖檔內容 objStream.Read(buffer, 0, objStream.Length) objStream.Close() ' 關閉串流 Response.BinaryWrite(buffer) ' 輸出圖檔
20
4-3-2 輸出圖片到瀏覽程式- Response.Charset屬性
Response.Charset可以取得或指定網頁的編碼方式,例如:中文Big5,如下所示: Response.Charset = "big5"
21
4-3-2 輸出圖片到瀏覽程式- Response.WriteFile()方法
Response.WriteFile("Ch4-3-2.txt") 程式碼是將Ch4-3-2.txt檔案內容輸出到瀏覽程式。
22
4-3-3 緩衝區的處理-說明1 在ASP.NET程式範例Ch4-3-3.aspx的開頭設定BufferOutput屬性,如下所示:
<% Response.BufferOutput = False %> <html> ……… <% Response.Redirect("Ch4-3-1Write.aspx") %> 程式碼的BufferOutput屬性設為False,表示不使用緩衝區。
23
4-3-3 緩衝區的處理-說明2 此時Response.Redirect()方法如果是插在HTML標籤中,即在<html>~</html>標籤間,就會出現錯誤訊息,如下圖所示:
24
4-3-3 緩衝區的處理-說明3 訊息指出已經寫入瀏覽程式的標題,將無法進行更改,這主要是因為緩衝區的問題。
因為伺服器在處理ASP.NET程式碼時,是將處理的結果先暫時存在緩衝區,等到輸出完整個網頁內容後,才送到瀏覽程式顯示,或是在ASP.NET程式執行Flush()或End()方法強迫將緩衝區的內容送出到瀏覽程式。
25
4-3-3 緩衝區的處理- Response.BufferOutput屬性
Response.BufferOutput屬性可以指定是否使用緩衝區,預設是True使用,如果不使用緩衝區,請設為False,如下所示: Response.BufferOutput = False
26
4-3-3 緩衝區的處理- Response.End()方法
Response.End()方法可以中斷ASP.NET程式的執行,例如:在ASP.NET使用Response.Write()方法輸出內容時,執行End()方法可以中斷程式執行且觸發Application_EndRequest事件。只需在ASP.NET程式需要中斷的地方加入此程式碼,如下所示: ……… Response.End() ASP.NET程式位在Response.End()之後的程式碼就不會執行,而且會將緩衝區的內容馬上送到瀏覽程式顯示。
27
4-3-3 緩衝區的處理- Response.Flush()方法
當ASP.NET執行到上述程式碼,不論是否已經完全輸出到緩衝區,都會強迫將目前緩衝區內容送到瀏覽程式顯示,我們可以重複使用此方法來送出緩衝區內容。
28
4-3-3 緩衝區的處理- Response.Clear()方法
程式碼會清除緩衝區內容,如同Response.ClearContent()方法。如果需要清除HTTP檔頭,請使用ClearHeaders()方法,如下所示: Response.ClearHeaders()
29
4-3-4 IIS輸出與瀏覽程式快取的控制-說明1
「快取」(Caching)是一種技術可以將網頁輸出內容或應用程式資料暫時儲存在客戶或伺服端,以便當重複請求相同資訊的網頁時,可以加速網頁顯示,特別適用在多次網頁請求,而且都是請求相同網頁內容的情況。 客戶端快取是將網頁內容保留在使用者電腦的快取資料夾,如果在快取中已經擁有網頁,就直接顯示網頁內容,Response物件的屬性可以設定網頁檔案儲存在快取資料夾的保留時間。
30
4-3-4 IIS輸出與瀏覽程式快取的控制-說明2
IIS的「輸出快取」(Output Cache)是當第一次編譯ASP.NET程式時,先將執行的結果儲存在輸出快取,然後輸出到瀏覽程式,當有其他請求時,如果程式沒有更改或快取中已經存在,就直接從快取將網頁資料送到客戶端,以便增加網頁瀏覽效率。
31
4-3-4 IIS輸出與瀏覽程式快取的控制-Response.Expires屬性
上述程式碼設定保留時間為3分鐘,如果設為0,表示不保留在快取。
32
4-3-4 IIS輸出與瀏覽程式快取的控制-Response.ExpiresAbsolute屬性
Response.ExpiresAbsolute = #December 31, :00:00# 屬性值是DateTime資料型態,請使用#符號括起,上述的保留期限是2007年底。
33
4-3-4 IIS輸出與瀏覽程式快取的控制-Response.Cache屬性
ASP.NET程式如果需要新增到輸出快取,可以直接使用OutputCache指引指令定義快取期限的規則,如下所示: OutputCache Duration=60 VaryByParam="none“ Location="Any" %> 上述指引指令的屬性說明,如下所示: Duration屬性:指定網頁儲存在輸出快取的時間,以秒為單位。 VaryByParam屬性:當網頁擁有不同URL參數,指定哪些網頁需要新增至快取。
34
4-3-4 IIS輸出與瀏覽程式快取的控制-HttpCachePolicy物件的使用1
當ASP.NET程式使用程式碼設定期限時,我們可以使用Response.Cache屬性取得網頁輸出快取的HttpCachePolicy物件,內含相關方法可以控制ASP.NET網頁的輸出快取,如下表所示:
35
4-3-4 IIS輸出與瀏覽程式快取的控制-HttpCachePolicy物件的使用2
在ASP.NET程式的快取設定需要位在Page物件的Page_Load()事件處理程序,其程式碼如下所示: <script runat="server"> Sub Page_Load(Sender As Object, E As EventArgs) Response.Cache.SetExpires( _ DateTime.Now.AddSeconds(30)) Response.Cache.SetCacheability( _ HttpCacheability.Public) End Sub </script>
36
4-4 基本輸入的Request物件 4-4-1 Form和QueryString的集合物件 4-4-2 使用表單欄位傳送資料
4-4-3 使用URL傳遞資料
37
4-4-1 Form和QueryString的集合物件-說明
ASP.NET伺服端網頁技術需要透過客戶端網頁來輸入資料。其輸入方式如下所示: HTML表單網頁:使用HTTP表單欄位以HTTP通訊協定的標頭來傳遞資料,關於HTML表單相關標籤的說明,請參閱書附光碟電子書「HTML與CSS網頁設計範例教本」第11章。 URL參數:從瀏覽程式輸入的URL網址參數傳遞,其總長度只有1024個字元。 Request物件可以取得表單或URL參數傳至網頁的資料,不論是表單欄位或是URL參數,都是使用Request物件的Form和QueryString集合物件來接收資料。
38
4-4-1 Form和QueryString的集合物件-Form集合物件
HTML網頁表單如果是使用post方法傳遞資料,其作法是將傳遞資料在編碼後,透過HTTP通訊協定標頭傳送到Web伺服器,在伺服端是使用Form集合物件來取出資料,其語法如下所示: Request(("FieldName") Request.Form("FieldName") Request物件可以使用Form屬性取得Form集合物件,或不指定屬性,在括號內的參數是欄位名稱字串,可以取得指定表單欄位值的字串。
39
4-4-1 Form和QueryString的集合物件-QueryString集合物件
HTML網頁表單如果是使用get方法傳遞資料,其作法是將傳遞的資料編碼後,透過URL網址後的字串傳送到Web伺服器,參數位在「?」問號之後,如果參數不只一個,請使用「&」符號分隔,如下所示: 當瀏覽程式輸入上述網址,按下Enter鍵後,在伺服端是使用QueryString集合物件來取出資料,如下所示: Request(("FieldName") Request.QueryString(" FieldName")
40
4-4-2 使用表單欄位傳送資料 在建立好HTML網頁表單後,就可以撰寫ASP.NET程式碼來取得表單欄位資料。表單處理程式是使用Form集合物件來取得表單欄位值,如下所示: name1 = Request.Form.GetValues("Username")(0) name2 = Request.Form.GetValues("Username")(1) pass1 = Request.Form("Password1") pass2 = Request("Password2") 程式碼使用GetValues()方法取得同名2個Username欄位和Password1、Password2欄位值,在括號內的名稱是表單欄位名稱。
41
4-4-3 使用URL傳遞資料 URL超連結傳遞的參數或表單get方法傳遞的內容,都是使用QueryString集合物件來取得參數或欄位值,如下所示: name = Request.QueryString("Username") pass = Request.QueryString("Password") 程式碼左邊是儲存傳遞資料的變數,在右邊括號內的名稱是參數或欄位名稱,這是一個字串。
42
4-5 Cookies的處理 4-5-1 Cookies的基礎 4-5-2 Cookies的操作函數
43
4-5-1 Cookies的基礎-說明 Cookies可以解決HTTP通訊協定無法保留資訊的問題,雖然我們可以使用文字檔案、XML文件和資料庫來儲存相關資料,但是對於成千上萬只來一次或數次的訪客而言,儲存這些資料實在太浪費硬碟空間,Cookies才是最佳的解決方案。 Cookies是儲存在客戶端,也就是瀏覽程式所在的電腦,所以並不會浪費伺服器資源,只需使用者進入網站時,就可以檢查客戶端是否有儲存Cookies,透過Cookie儲存的資訊來建立複雜的Web應用程式。
44
4-5-1 Cookies的基礎-使用 個人資訊:Cookies可以保留個人資訊,例如:姓名、地址、時區、帳號和是否曾經造訪網站,詳見第14章的說明。 個人化的資訊:Cookies可以建立個人化網站外觀和個人偏好的網站內容,或者提供使用者有興趣的資訊,詳見第14章的說明。 網站購物車:線上購物車需要儲存使用者選購的商品,Cookies也可以用來記錄選購商品。
45
4-5-1 Cookies的基礎-問題 瀏覽程式是否支援Cookies:雖然Internet Explorer和Netscape瀏覽程式都支援Cookies,不過在IE 4.0前的版本,需要設定接受Cookies,5.0之後的版本預設接受Cookies且使用者無法更改,不過,仍然有少數使用者的瀏覽程式並不支援Cookies。 Cookies可以刪除:因為Cookies是儲存在客戶端電腦,所以可能在升級瀏覽程式或電腦軟體時,破壞或刪除Cookies檔案。 Cookies可能修改:因為Cookies儲存在客戶端電腦,使用者可以自己修改Cookies的內容,換句話說,不可以使用Cookies儲存重要資訊。 Cookies能夠複製:Cookies檔案可以複製,當然有可能被其他使用者複製或偷走。
46
4-5-2 Cookies的操作函數-新增Cookie1
在ASP.NET是使用Response物件的Cookies集合物件來新增Cookie,其程式碼如下所示: Response.Cookies(cName).Value = _ Server.UrlEncode(cValue) 上述程式碼沒有Key鍵名,使用Server物件的UrlEncode()方法進行編碼,以便正確處理中文內容的Cookie。 如果Cookie擁有Key鍵名,在新增時需要使用鍵名,如下所示: Response.Cookies(cName)(cKey) = _
47
4-5-2 Cookies的操作函數-新增Cookie2
在建立好Cookie後,每一個Cookie是一個HttpCookie物件,其常用屬性有Domain屬性設定網域名稱,Path屬性指定Cookie路徑,Expires指定有效期限,目前我們只有設定Expires屬性,如下所示: Response.Cookies(cName).Expires = DateTime.Now.AddDays(cExpires) 程式碼使用DateTime.Now取得目前電腦日期時間,然後使用AddDays()方法增加有效期限的日數。
48
4-5-2 Cookies的操作函數-刪除Cookie
刪除操作是將Expires屬性的有效日期設為過期的一年前,如下所示: Response.Cookies(cName).Expires = _ DateTime.Now.AddDays(-365)
49
4-5-2 Cookies的操作函數-取得Cookie值
在ASP.NET程式取得Cookie值是使用Request物件的Cookies集合物件,如下所示: Server.UrlDecode(Request.Cookies(cName)(cKey)) 程式碼擁有鍵名,取得的值使用Server物件的UrlDecoder()方法進行解碼。 如果沒有鍵名是使用HttpCookie物件的Value屬性取得其值,其程式碼如下所示: Server.UrlDecode(Request.Cookies(cName).Value)
50
4-6 伺服器與瀏覽程式資訊 4-6-1 Web伺服器的系統資訊 4-6-2 取得瀏覽程式資訊 4-6-3 取得客戶端的憑證資料
51
4-6-1 Web伺服器的系統資訊-說明 Web伺服器的系統資訊可以使用Request物件的ServerVariables屬性來取得,這是一個集合物件,以參數的Server變數字串來取得指定的系統資訊。例如:取得使用者IP位址和目前ASP.NET程式的虛擬路徑,如下所示: IPAddress = Request.ServerVariables("REMOTE_ADDR") strPath = Request.ServerVariables("PATH_INFO") 程式碼的參數就是需要取得的參數字串,也就是Server變數名稱。
52
4-6-1 Web伺服器的系統資訊-Server變數
53
4-6-2 取得瀏覽程式資訊-說明 Request物件的Browser屬性可以取得HttpBrowserCapabilities集合物件,即客戶端瀏覽程式的相關資訊,以便得知瀏覽程式提供哪些功能。 在ASP.NET程式是使用Request物件的Browser屬性來取得此物件,如下所示: Dim hbc As HttpBrowserCapabilities = Request.Browser 程式碼在取得HttpBrowserCapabilities物件後,就可以使用相關屬性來取得瀏覽程式支援的功能。
54
4-6-2 取得瀏覽程式資訊-屬性
55
4-6-3 取得客戶端的憑證資料-說明 Request.ClientCertificate屬性可以取得客戶端的憑證資料,如下所示:
Dim hcc As HttpClientCertificate = _ Request.ClientCertificate 上述程式碼在取得HttpClientCertificate物件後,就可以使用相關屬性來取得憑證資料。例如:檢查是否擁有客戶端憑證,如下所示: Response.Write("是否有憑證: " & _ hcc.IsPresent & BR) 程式碼可以取得IsPresent屬性的值,True表示有,False表示沒有憑證。
56
4-6-3 取得客戶端的憑證資料-屬性
57
4-7 Include指令的使用-include virtual的使用
include virtual指令是使用Web伺服器虛擬目錄的主目錄,作為根路徑的相對路徑來插入檔案。例如:函式庫檔案CookiesLib.inc是位在Web伺服器的主目錄,此時include virtual程式碼,如下所示: <!--#include virtual=”/CookiesLib.inc”--> 程式碼是使用Web伺服器的主目錄作為根目錄,ASP.NET程式可以使用相同程式碼來插入函式庫檔案。
58
4-7 Include指令的使用-include file的使用
<!--#include file=”../CookiesLib.inc”--> 程式碼是讓位於【Ch04】子目錄的ASP.NET程式插入函式庫檔案,所以需要指明路徑為「../」,才能正確的找到函式庫檔案。
59
4-8 ASP.NET程式的除錯-說明 在開發ASP.NET程式時,如果單純語法錯誤,在編譯階段,原始程式錯誤(Source Error)區塊就會指出錯誤產生的程式碼列號,和顯示錯誤的程式碼。 如果是在伺服端執行時才發生錯誤,我們可以開啟除錯模式來顯示進一步的錯誤資訊,或是使用Trace類別來追蹤錯誤發生的原因。
60
4-8 ASP.NET程式的除錯-開啟除錯模式 當伺服端執行時發生錯誤,我們需要開啟「除錯模式」(Debug Mode),才能顯示進一步的錯誤資訊。 請在ASP.NET程式檔案開頭加上Page指引的Debug屬性,如下所示: Page Language="VB" Debug="True" %> Page指引的Debug屬性True表示開啟除錯模式,此時在執行ASP.NET,當伺服端產生錯誤,就可以顯示進一步的除錯資料。
61
4-8 ASP.NET程式的除錯-追蹤模式與Trace類別1
請在ASP.NET程式檔案開頭加上Page指引的Trace屬性,如下所示: Page Language="VB" Trace="True" %> Page指引的Trace屬性True表示開啟追蹤模式。不只如此,我們還可以使用TraceMode屬性來指定排序方式,如下所示: Page Language="VB" Trace="True" TraceMode="sortByCategory" %> Page指引的TraceMode屬性值是sortByCategory,表示以分類進行排序。
62
4-8 ASP.NET程式的除錯-追蹤模式與Trace類別2
If Trace.IsEnabled Then Trace.Warn("MyTrace", "Count : " & i) End If If條件使用IsEnabled屬性判斷是否開啟追蹤模式,如果開啟,就使用Warn()方法寫入紅色的除錯訊息,第1個參數是分類名稱,第2個參數就是除錯訊息。
Similar presentations