Ch08 ASP.NET的HTTP物件 網頁程式設計
大綱 Response物件 Request物件 Server物件
Response物件 常用的Response物件的方法 Response.Write() Response.Redirect() 緩衝區處理 Response.BufferOutput Response.End() Response.Flush() Response.Clear() 快取處理 設定輸出內容的資料類型
輸出HTML標籤與文字內容-說明 Response.Write()方法可以在ASP.NET程式將任何資料型態輸出到瀏覽程式顯示,換句話說,輸出的內容可以是字串、HTML標籤或變數,而且不論變數資料為何,都是使用字串形式輸出到瀏覽程式,如下所示: Response.Write(title & "<br/>") Response.Write("歡迎使用ASP.NET設計動態網頁<br/>")
輸出HTML標籤與文字內容-簡化寫法 Response.Write()方法擁有另一種形式,可以直接插入HTML標籤,以便更改標籤的屬性或內容,如下所示: <%=title%> 「<%=」和「%>」符號間就是輸出變數title內容,屬於Response.Write()方法的簡化寫法。
輸出文字檔案 Response.WriteFile方法可將文字檔案中的所有內容,輸出到網頁上 檔案名稱需使用 相對位址 或 絶對位址 的寫法
轉向到其它的網頁或ASP.NET程式 Response.Redirect()方法可以在執行ASP.NET程式時,轉向到其它的網址或網站的其它網頁或ASP.NET程式,因為轉向到其它網頁,所以執行此方法後的指令或HTML標籤並不會顯示,如下所示: Response.Redirect("Ch9-1-1.aspx") 參數允許使用完整的URL網址或同一個網站檔案的相對路徑,也可以是其它HTML文件,如下: Response.Redirect("../Ch08/Ch8-1-1.aspx") Response.Redirect("http://www.hinet.net")
中斷ASP.NET程式的執行 ASP.NET程式主要是使用Response.Write()方法輸出網頁內容,如果程式需要中斷輸出,只需在程式的中斷點插入Response.End()方法,其程式碼如下: ……… Response.End() ..…….. 輸出指令前的HTML標籤或執行的ASP.NET程式,Response.End()方法後的程式碼或HTML標籤就不會執行或顯示,因為ASP.NET會使用緩衝區,此方法會將緩衝區的內容送到瀏覽程式顯示。
範例1:轉向到其他網頁,中斷程式 <html> <head> <title>Response物件的練習</title> <Script language="VB" runat="Server"> Sub button_click(o As Object, e As Eventargs) If s1.Items(0).Selected Then Response.Redirect("Ex09_01_01.aspx") Else If s1.Items(1).Selected Then Response.WriteFile("Ex09_01_01.txt") Response.End End If End Sub </Script> <body> <Form runat="server"> <asp:DropDownList id="s1" runat="server"> <asp:ListItem text="轉向另一頁" value="轉向" /> <asp:ListItem text="輸出文字檔內容" value="輸出" /> <asp:ListItem text="結束" value="結束" /> </asp:DropDownList> <asp:button id="b1" text="送出" OnClick="button_click" runat="server" /> </Form> </body> </html>
檢查網頁瀏覽者是否連線 當網頁瀏覽者從伺服端執行一個耗時的程式,有可能因等得不煩而切斷連線,此時伺服端並不會因為網頁瀏覽者的斷線,而自動停止當初網頁瀏覽者執行的程式 可以利用Response.IsClientConnected方法取得網頁瀏覽者是否已斷線 If Response.IsClientConnected = False Then Response.End() End If
ASP.NET緩衝區的用途-說明 Web伺服器在執行ASP.NET程式碼時,可以選擇 將處理的結果馬上輸出到瀏覽程式,或是先輸出 到暫放的緩衝區,等到ASP.NET程式執行完後, 才送到瀏覽程式顯示,如下圖所示:
ASP.NET緩衝區的用途-輸出到緩衝區 當遇到下列的3種情況才會將輸出的內容送到瀏覽程式,如下所示: 執行完ASP.NET程式後。 執行到Response.End()方法中斷ASP.NET程式的執行,此時已執行的部分就會送出。 執行到Response.Flush()方法馬上將緩衝區的內容送出。
設定是否使用緩衝區-說明 Response.BufferOutput屬性可以指定是否使用緩衝區,預設值True,表示使用,如果不使用緩衝區,請設為False,如下所示: Response.BufferOutput = False 程式碼表示ASP.NET程式不使用緩衝區,一旦程式沒有使用緩衝區,在執行轉向時,就會出現標題寫入錯誤。
設定是否使用緩衝區-錯誤訊息
馬上輸出緩衝區的內容 ASP.NET程式預設使用緩衝區,換句話說,其輸出的內容是先送到緩衝區,等到程式執行完成後,才將緩衝區的內容一起送到瀏覽程式顯示,如果需要將目前的緩衝區內容,在尚未執行完ASP.NET程式前強迫輸出到瀏覽程式,可以使用Response.Flush()方法,如下所示: Response.Flush() 當ASP.NET程式執行到上述方法,馬上就會將目前緩衝區的內容都送到瀏覽程式顯示。
清除緩衝區的內容 如果伺服器緩衝區的內容已經不需要了,或是根本不需要將緩衝區內容輸出到瀏覽程式顯示,我們可以在ASP.NET程式使用Response.Clear()方法清除緩衝區內容,不過這並不含HTTP通訊協定的標頭資料,如下所示: Response.Clear() 在執行上述Response.Clear()方法後,和上一次執行Response.Flush()方法間輸出的網頁內容就會被清除掉。
ASP.NET輸出快取的處理 「快取」(Caching)是一種技術可以將網頁輸出或是應用程式本身的資料暫時儲存在客戶或伺服端,以便當重複請求相同資訊的網頁時,可以加速網頁的顯示,特別適用在多次網頁請求,而且都是請求相同網頁內容的情況。
輸出快取的用途-說明 「輸出快取」(Output Cache)是當第一 次編譯執行ASP.NET程式時,先將執行結 果的網頁內容儲存在輸出快取,然後再輸 出到瀏覽程式,當有其它請求時,如果程 式沒有更改或已經是快取中已經存在網頁, 就直接從快取將網頁資料送到客戶端,如 此可以增加網頁瀏覽的效率。
輸出快取的用途-儲存位置 輸出快取可以將資料儲存在伺服端、客戶端或Proxy伺服器,以客戶端快取為例,是將網頁內容保留在使用者電腦「C:\Documents and Settings\Joe Chen\Local Settings\Temporary Internet Files」的快取資料夾。
設定保留在快取的時間 Response.Expires屬性可以設定和取得網頁保留在瀏覽程式快取的分鐘數,如果使用者在保留期限前請求此網頁,顯示的是儲存在快取的網頁,如果超過期限,才會連線伺服器取得最新的網頁內容,其程式碼如下所示: Response.Expires = 3 程式碼設定保留的時間為3分鐘,如果設為0表示不保留在快取。
設定在快取保留的期限 Response.ExpiresAbsolute屬性可以指定和取得網頁保留期限的日期和時間,其程式碼如下所示: 屬性值是Date資料型態,請使用#符號括起,上述的保留期限是2006年底。
ASP.NET的快取處理-說明 在ASP.NET程式可以使用Response.Cache屬性取得網頁輸出快取的HttpCachePolicy物件,內含數種方法可以控制ASP.NET網頁的輸出快取,如下表所示:
ASP.NET的快取處理-範例 ASP.NET程式的快取設定需要位在Page物件的Page_Load事件處理程序,如下所示: Sub Page_Load(Sender As Object, e As Eventargs) Dim dtDay As Date = Today Response.Cache.SetExpires(DateAdd("D", 5, dtDay)) Response.Cache.SetCacheability(HttpCacheability.Public) End Sub Page_Load事件處理程序使用Response.Cache屬性取得物件,然後使用SetExpires()方法設定期限,使用DateAdd()函數新增5天,換句話說,期限是目前日期加上5天。
ASP.NET的快取處理-SetCacheability()方法參數
設定輸出文件內容的資料類型-說明 Response物件是使用HTTP通訊協定傳送資料到瀏覽程式,雖然通訊協定與資料類型並沒有關係,不過在傳送資料前,需要設定資料種類Response.ContentType屬性,其值就是MIME資料類型。 text/html為預設值,如果需要輸出成其它的文件類型時,我們可以設定MIME資料類型,其程式碼如下所示: Response.ContentType = "text/xml" 程式碼指定傳送的內容為XML文件。
設定輸出文件內容的資料類型-MIME資料類型
取得網頁的編碼方式 Response物件的Charset和ContentEncoding屬性都可以取得或指定網頁的編碼方式,如下所示: Response.Write(Response.Charset & "<br>") Response.Write(Response.ContentEncoding.EncodingName) 程式碼分別可以顯示編碼方式的字元集,其差異在第2列程式的ContentEncoding屬性可以取得Encoding物件,EncodingName屬性是完整的編碼名稱。
Request物件 取得伺服器系統資訊 瀏覽程式的資訊 Request表單處理
伺服器系統資訊的內容-說明 Web伺服器的系統資訊是Request物件的集 合物件ServerVariables 這個集合物件可以取得伺服器的系統資訊。
伺服器系統資訊的內容-常用的Server變數1
伺服器系統資訊的內容-常用的Server變數2
Request.ServerVariables取得系統資訊 IPAddress = Request.ServerVariables("REMOTE_ADDR") strPath = Request.ServerVariables("PATH_INFO") 如果需要顯示伺服器所有的環境變數,可以使用For Each迴圈取得所有的環境變數,如下: For Each ServerVar In Request.ServerVariables strValue = Request.Servervariables(ServerVar) Next
瀏覽程式的相關資訊-說明 在ASP.NET是使用Request物件的Browser屬性達到相同的功能。 因為客戶端瀏覽程式連線Web伺服器時,「HTTP使用者代理人標頭」(HTTP User Agent Header)資訊會傳送給伺服器,這個標頭資訊的內容是瀏覽程式的相關資訊,在ASP.NET程式可以使用Request物件取得集合物件,如下所示: Dim hbc As HttpBrowserCapabilities = Request.Browser 例如:承上例,要取得瀏覽程式的名稱: hbc.Browser
瀏覽程式的相關資訊-屬性1
瀏覽程式的相關資訊-屬性2
Server物件 建立COM元件 取得伺服端的路徑 伺服端的轉址功能 執行其他ASP.NET程式
ASP.NET建立COM元件-說明 雖然ASP.NET技術可以使用.NET Framework龐大的類別物件,不過我們還 是可以自行使用COM元件來擴充ASP.NET 功能,不只如此,如果使用者熟悉VB.NET、 C++或Delphi等開發工具,使用者還可以自 行建立COM元件,輕鬆擴充ASP.NET程式 的功能。
ASP.NET建立COM元件-使用 在ASP.NET程式建立外部COM元件前,需要在伺服器先安裝好元件,在安裝好後才能使用Server.CreateObject()方法建立所需的物件(一個元件可能內含數個物件),例如:舊版ASP 3.0的FileSystemObject物件,如下所示: fso = Server.CreateObject("Scripting.FileSystemObject")
取得伺服器路徑 Web伺服器的目錄架構屬於虛擬目錄,其路徑也是虛擬路徑,如果想取得目前執行ASP.NET程式的虛擬目錄,請使用ServerVariables集合物件的PATH_INFO參數,如下所示: Request.ServerVariables("PATH_INFO") 配合Server.MapPath()方法就可以轉換成實際路徑,其程式碼如下所示: strPath = Server.MapPath(Request.ServerVariables("PATH_INFO")) 如果需要取得指定ASP.NET程式或檔案的實際路徑,如下所示: strPath = Server.MapPath("/Ch10/Ch10-4-1.aspx")
伺服端網頁轉向-說明 Server.Transfer()方法可以取代 Response.Redirect()方法,因為 Response.Redirect()需要與瀏覽程式進行 較多次的通訊,需要先傳送訊息給瀏覽程 式,告訴瀏覽程式需要載入新網址URL, 瀏覽程式在接受請求後,再送一次URL請 求到Web伺服器,最後伺服器才處理新 URL來送回HTML文件。
伺服端網頁轉向-使用 Response.Redirect()方法浪費較多的頻寬在瀏覽程式和伺服器間的通訊,Server.Transfer()方法轉向操作完全在伺服端完成,並不會浪費頻寬,其使用方式和Response.Redirct()方法幾乎相同,如下所示: Server.Transfer("Ch10-4-2.aspx") 程式碼將會轉向到ASP.NET程式Ch10-4-2.aspx。
伺服端執行網頁 Server.Execute()方法和Transfer()方法很相似,不過Execute()方法有些像VB.NET語言的主程式呼叫副程序,當轉向的ASP.NET程式執行完成後,還會回到呼叫轉向的ASP.NET程式,其程式碼如下所示: …… Server.Execute("Ch10-4-4s.aspx") 程式碼在執行轉向到ASP.NET程式Ch10-4-4s.aspx,在執行完後還會回到上述程式碼,執行Server.Execute()方法的下一列程式碼。
Server Side Include 「SSI」(Server Side Include)指令可以在伺服端插入一些資訊到HTML文件或ASP.NET程式,用來設定訊息、環境變數、執行程式檔、取得檔案資訊或插入純文字檔的內容。
SSI的指令說明-指令
SSI的指令說明-使用 Include指令可以讓我們在ASP.NET程式插入HTML標籤或其它ASP.NET程式碼檔案,Include指令一共有2種Include virtual和Include file,需要插在<% .. %>符號外,如下所示: <!--#include virtual="/somefile.aspx"--> 程式碼使用檔案的虛擬路徑,插入的ASP.NET程式是位在Web伺服器的主目錄,如果是include file指令,如下所示: <!--#include file="somefile.aspx"-->
使用SSI 插入HTML文件 Include指令可以在ASP.NET程式插入HTML文件,其主要的目的是用來建立一致化的網頁編排,例如:在ASP.NET程式的開頭和結束分別插入2個檔案,如下所示: <html> <head></head> <body> <!-- #include file="Ch10-5-2h.htm" --> …….. <!-- #include file="Ch10-5-2f.htm" --> </body> </html>
使用SSI插入ASP.NET函式庫 如果有很多個ASP.NET程式需要使用同一個函數或程序,我們可以將程序和函數抽出成為函式庫檔案,通常的副檔名為.inc,然後使用SSI的Include指令插入其它的ASP.NET程式。 ASP.NET程式馬上就可以使用這些程序和函數,如同使用ASP.NET函式庫,如下所示: <!-- #include file="Ch10-5-3.inc" --> include指令插入ASP.NET程式檔案,這個指令需要在「<%」和「%>」外。