(1)簡述ASP.NET內(nèi)置對象。 答:ASP.NET提供了內(nèi)置對象有Page、Request、Response、Application、Session、Server、Mail和Cookies。這些對象使用戶更容易收集通過瀏覽器請求發(fā)送的信息、響應(yīng)瀏覽器以及存儲用戶信息,以實現(xiàn)其他特定的狀態(tài)管理和頁面信息的傳遞。 ?。?)簡述Response對象。 答:Response對象用來訪問所創(chuàng)建的并客戶端的響應(yīng),輸出信息到客戶端,它提供了標(biāo)識服務(wù)器和性能的HTTP變量,發(fā)送給瀏覽器的信息和在cookie中存儲的信息。它也提供了一系列用于創(chuàng)建輸出頁面的方法,如無所不在的Response . Write方法。 ?。?)簡述Request對象。 答:Request對象是用來獲取客戶端在請求一個頁面或傳送一個Form時提供的所有信息,這包括能夠標(biāo)識瀏覽器和用戶的HTTP變量,存儲在客戶端的cookie信息以及附在URL后面的值(查詢字符串或頁面中< Form>段中的HTML控件內(nèi)的值)。 ?。?)簡述Application對象。 答:在asp.net環(huán)境下,Application對象來自HttpApplictionStat類。它可以在多個請求、連接之間共享公用信息,也可以在各個請求連接之間充當(dāng)信息傳遞的管道。使用Application對象來保存我們希望傳遞的變量。由于在整個應(yīng)用程序生存周期中,Application對象都是有效的,所以在不同的頁面中都可以對它進(jìn)行存取,就像使用全局變量一樣方便。 ?。?)簡述Session對象。 答:Session對象就是服務(wù)器給客戶端的一個編號。當(dāng)一臺WEB服務(wù)器運行時,可能有若干個用戶瀏覽正在瀏覽這臺服務(wù)器上的網(wǎng)站。當(dāng)每個用戶首次與這臺WWW服務(wù)器建立連接時,他就與這個服務(wù)器建立了一個Session,同時服務(wù)器會自動為其分配一個SessionID,用以標(biāo)識這個用戶的唯一身份。特別說明的是Session對象的變量只是對一個用戶有效,不同的用戶的會話信息用不同的Session對象的變量存儲。在網(wǎng)絡(luò)環(huán)境下Session對象的變量是有生命周期的,如果在規(guī)定的時間沒有對Session對象的變量刷新,系統(tǒng)會終止這些變量。 ?。?)簡述Server對象。 答:Server對象提供對服務(wù)器上的方法和屬性的訪問。其中大多數(shù)方法和屬性是作為實用程序的功能服務(wù)的。Server對象也是Page對象的成員之一,主要提供一些處理頁面請求時所需的功能;例如建立COM對象、將字符串的編譯碼等工作。 (7)簡述Cookie對象。 答:cookie是一小塊由瀏覽器存貯在客戶端系統(tǒng)上(硬盤)的文本,是一種標(biāo)記。由WEB服務(wù)器嵌入用戶瀏覽器中,以便標(biāo)識用戶,且隨同每次用戶請求發(fā)往WEB服務(wù)器。Cookies的值比A S P.NET其他集合(例如Form和Server Variables )的值要復(fù)雜得多。 ?。?)簡述Mail對象。 答:ASP.NET被賦予了一個發(fā)送Email的新對象,名為SmtpMail,實際上Mail對象由System.Web.Mail類庫實現(xiàn)(Class Library)。這個類庫由MailMessage對象、SmtpMail對象、MailFormat對象和MailAttachment對象組成,它們相互合作,完成E-mail的發(fā)送。 ?。?)簡述GET傳送方式。 ********************* ASP.NET中常用的內(nèi)置對象(一) ****************************** 本想寫一篇總結(jié)ASP.NET內(nèi)置對象的文章,結(jié)果發(fā)現(xiàn)網(wǎng)上有篇不錯的,就轉(zhuǎn)了過來 Application_Start 在應(yīng)用程序啟動時激發(fā) Application_BeginRequest 在每個請求開始時激發(fā) Application_AuthenticateRequest 嘗試對使用者進(jìn)行身份驗證時激發(fā) Application_Error 在發(fā)生錯誤時激發(fā) Application_End 在應(yīng)用程序結(jié)束時激發(fā) Session即會話,是指一個用戶在一段時間內(nèi)對某一個站點的一次訪問。 Session對象在.NET中對應(yīng)HttpSessionState類,表示“會話狀態(tài)”,可以保存與當(dāng)前用戶會話相關(guān)的信息。 Session對象用于存儲從一個用戶開始訪問某個特定的aspx的頁面起,到用戶離開為止,特定的用戶會話所需要的信息。用戶在應(yīng)用程序的頁面切換時,Session對象的變量不會被清除。 對于一個Web應(yīng)用程序而言,所有用戶訪問到的Application對象的內(nèi)容是完全一樣的;而不同用戶會話訪問到的Session對象的內(nèi)容則各不相同。 Session可以保存變量,該變量只能供一個用戶使用,也就是說,每一個網(wǎng)頁瀏覽者都有自己的Session對象變量,即Session對象具有唯一性。 (1)將新的項添加到會話狀態(tài)中 語法格式為: Session ("鍵名") = 值 或者 Session.Add( "鍵名" , 值) (2)按名稱獲取會話狀態(tài)中的值 語法格式為: 變量 = Session ("鍵名") 或者 變量 = Session.Item("鍵名") (3)刪除會話狀態(tài)集合中的項 語法格式為: Session.Remove("鍵名") (4)清除會話狀態(tài)中的所有值 語法格式為: Session.RemoveAll() 或者 Session.Clear() (5)取消當(dāng)前會話 語法格式為: Session.Abandon() (6)設(shè)置會話狀態(tài)的超時期限,以分鐘為單位。 語法格式為: Session.TimeOut = 數(shù)值 Global.asax 文件中有2個事件應(yīng)用于Session對象 事件名稱 說明 Session_Start 在會話啟動時激發(fā) Session_End 在會話結(jié)束時激發(fā) Cookie就是Web服務(wù)器保存在用戶硬盤上的一段文本。Cookie允許一個Web站點在用戶的電腦上保存信息并且隨后再取回它。信息的片斷以‘鍵/值’對的形式存儲。 Cookie是保存在客戶機(jī)硬盤上的一個文本文件,可以存儲有關(guān)特定客戶端、會話或應(yīng)用程序的信息,在.NET中對應(yīng)HttpCookie類。 有兩種類型的Cookie:會話Cookie(Session Cookie)和持久性Cookie。前者是臨時性的,一旦會話狀態(tài)結(jié)束它將不復(fù)存在;后者則具有確定的過期日期,在過期之前Cookie在用戶的計算機(jī)上以文本文件的形式存儲。 在服務(wù)器上創(chuàng)建并向客戶端輸出Cookie可以利用Response對象實現(xiàn)。 Response對象支持一個名為Cookies的集合,可以將Cookie對象添加到該集合中,從而向客戶端輸出Cookie。 通過Request對象的Cookies集合來訪問Cookie ********************** 本章主要介紹ASP.NET的內(nèi)置對象及ASP.NET應(yīng)用程序的配置,并在最后一節(jié)介紹ASP.NET網(wǎng)站的預(yù)編譯和編譯。ASP.NET的內(nèi)置對象包括Request、Response、Server、Application、Session、Cookie等。應(yīng)用程序的配置部分主要包括了解ASP.NET應(yīng)用程序配置、基本配置元素、自定義應(yīng)用程序設(shè)置的配置和檢索等。下面將分別對這些內(nèi)容進(jìn)行闡述。 14.1 ASP.NET內(nèi)置對象ASP.NET提供了許多內(nèi)置對象,前面所使用的Response對象就是其中一個。這些對象提供了相當(dāng)多的功能,例如,可以在兩個網(wǎng)頁之間傳遞變量、輸出數(shù)據(jù),以及記錄變量值等。這些對象在ASP時代已經(jīng)存在,到了ASP.NET環(huán)境下,這些功能仍然可以使用。而且,它們的種類更多,功能也更強(qiáng)大。 ASP.NET內(nèi)置對象是由IIS控制臺初始化的ActiveX DLL組件。因為IIS可以初始化這些內(nèi)置組件用于ASP.NET中,所以用戶也可以直接引用這些組件來實現(xiàn)自己的編程,即可以在應(yīng)用程序中,通過引用這些組件來實現(xiàn)訪問ASP.NET內(nèi)置對象的功能。 本節(jié)將對ASP.NET的這些內(nèi)置對象,以及Cache對象和Global文件進(jìn)行詳細(xì)的講解。 14.1.1 Response對象Response對象是HttpResponse類的一個實例。該類主要是封裝來自ASP.NET操作的HTTP響應(yīng)信息。 1.Response對象的屬性Response對象的屬性如表14-1所示。 表14-1 Response對象的屬性
續(xù)表
實例14-1:使用緩沖區(qū) 由于Response對象的BufferOutput屬性默認(rèn)為True,所以要輸出到客戶端的數(shù)據(jù)都暫時存儲在緩沖區(qū)內(nèi),等到所有的事件程序,以及所有的頁面對象全部解譯完畢后,才將所有在緩沖區(qū)中的數(shù)據(jù)送到客戶端的瀏覽器。下面的例子將演示緩沖區(qū)是如何工作的。 <% Response.Write("緩存已清除" + "<Br>"); %> <Script Language="C#" Runat="Server"> void Page_Load(Object sender, EventArgs e) { Response.Write("緩存清除前" + "<Br>"); Response.Clear(); } </Script> 上述程序代碼實例首先在“Page_Load”事件中送出“緩存清除前”這一行,此時的數(shù)據(jù)存在緩沖區(qū)中。接著使用Response對象的Clear方法將緩沖區(qū)的數(shù)據(jù)清除,所以剛剛送出的字符串已經(jīng)被清除。然后IIS開始讀取HTML組件的部分,并將結(jié)果送至客戶端的瀏覽器。由執(zhí)行結(jié)果只出現(xiàn)“緩存已清除”可知,使用Clear方法之前的數(shù)據(jù)并沒有出現(xiàn)在瀏覽器上,所以程序開始時是存在緩沖區(qū)內(nèi)的。如果在相同的程序中加入“Response.BufferOutput=false”: <% Response.Write("清除之后的數(shù)據(jù)<Br>"); %> <Script Language="C#" Runat="Server"> void Page_Load(Object sender, EventArgs e) { Response.BufferOutput=false; Response.Write("清除緩沖區(qū)之前的數(shù)據(jù)" + "<Br>"); Response.Clear(); } </Script> 可以發(fā)現(xiàn),執(zhí)行的結(jié)果并沒有因為使用Clear方法而將緩沖區(qū)的數(shù)據(jù)清除,這表明數(shù)據(jù)是直接輸出而沒有存放在緩沖區(qū)內(nèi)。 2.Response對象的方法Response對象可以輸出信息到客戶端,包括直接發(fā)送信息給瀏覽器、重定向瀏覽器到另一個URL或設(shè)置cookie的值。表14-2列舉了幾個常用的方法。 表14-2 Response對象的方法
ASP.NET中引用對象方法的語法是“對象名.方法名”?!胺椒ā本褪乔度氲綄ο蠖x中的程序代碼,它定義對象怎樣去處理信息。使用嵌入的方法,對象便知道如何去執(zhí)行任務(wù),而不用提供額外的指令。以下將通過幾個小例子來講解Response對象的常用方法。 實例14-2:使用Response.write,向客戶端發(fā)送信息 for(int i=1;i<=500;i++) { Response.Write("i= "+i+"<BR>"); } 本例使用“write”方法,向屏幕輸出500個值。 實例14-3:使用Response.End方法調(diào)試程序 End方法可以停止當(dāng)前頁面的執(zhí)行,基于這個原因,可以結(jié)合Response.write方法輸出當(dāng)前頁面上的某個變量、數(shù)組值。 <form id="Form1" method="post" runat="server"> 輸入一個數(shù)值:<asp:TextBox id="txtVar" runat="server"></asp:TextBox> <asp:Button id="btnSubmit" runat="server" Text="計算該值的平方值" onclick="btnSubmit_Click"></asp:Button> </form> <Script Language="C#" Runat="Server"> void btnSubmit_Click(Object sender, EventArgs e) { int N = int.Parse(Request.Form["txtVar"].ToString()); Response.Write("N=" + N + "<br>"); Response.Write("該值的平方值是:" + N*N); } </Script> 運行上面的代碼,結(jié)果如圖14-1所示。 圖14-1 使用Response.End調(diào)試程序 輸入一個值“6”,然后單擊“計算該值的平方值”按鈕,屏幕將顯示如下結(jié)果: N=6 該值的平方值是:36 在代碼中加上“Response.End()”,代碼如下: <Script Language="C#" Runat="Server"> void btnSubmit_Click(Object sender, EventArgs e) { int N = int.Parse(Request.Form["txtVar"].ToString()); Response.Write("N=" + N + "<br>"); Response.End(); Response.Write("該值的平方值是:" + N*N); } </Script> 這時再運行代碼,將只會顯示: N=6 實驗證明,“Response.End()”方法停止了當(dāng)前頁面的執(zhí)行。這僅僅是一個小例子,讀者可以依此類推,在程序中使用End方法進(jìn)行調(diào)試。不過千萬要記住調(diào)試完代碼后,不要忘記把調(diào)試用的“Response.End()”刪掉。 實例14-4:使用Redirect方法進(jìn)行頁面重定向 在網(wǎng)頁編程中,經(jīng)常會遇到在程序執(zhí)行到某個位置進(jìn)行頁面調(diào)轉(zhuǎn)的情況。Response.Redirect方法可以滿足這種需求,例如代碼: Response.Redirect("http://www.163.com"); 執(zhí)行該代碼,頁面將跳轉(zhuǎn)到網(wǎng)易163的主頁。 14.1.2 Request對象Request對象是HttpRequest類的一個實例。它能夠讀取客戶端在Web請求期間發(fā)送的HTTP值。 1.Request對象的屬性Request對象的屬性如表14-3所示。 表14-3 Request對象的屬性
實例14-5:獲取QueryString值 程序中,經(jīng)常可以使用QueryString來獲得從上一個頁面?zhèn)鬟f來的字符串參數(shù)。例如,在頁面1中創(chuàng)建一個連接,指向頁面2,并用QueryString來查詢兩個變量: <a href="Page2.aspx?ID=6&Name=Wang">查看</a> 在頁面2中接收到從頁面1中傳過來的兩個變量: <Script Language="C#" Runat="Server"> void Page_Load(object sender, System.EventArgs e) { Response.Write("變量ID的值:" + Request.QueryString["ID"] +"<br>"); Response.Write("變量Name的值:" + Request.QueryString["Name"]); } </Script> 運行上面代碼結(jié)果如下: 變量ID的值:6 變量Name的值:Wang 上面的例子可以成功地得到QueryString的值。 用類似方法,可以獲取Form,Cookies,SeverVaiables的值。調(diào)用方法都是: Request.Collectlon[”VariabLe”] Collectlon包括QueryString,F(xiàn)orM,Cookies,SeverVaiables四種集合,VariabLe為要查詢的關(guān)鍵字。不過,這里的Collectlon是可以省略的,也就是說,Request["Variable"]與Request.Collection["Variable"]這兩種寫法都是允許的。如果省略了Collection,那么Request對象會依照QueryString,F(xiàn)orm,Cookies,SeverVaiables的順序查找,直至發(fā)現(xiàn)Variable所指的關(guān)鍵字并返回其值,如果沒有發(fā)現(xiàn)其值,方法則返回空值(Null)。 不過,為了優(yōu)化程序的執(zhí)行效率,建議最好還是使用Collection,因為過多地搜索就會降低程序的執(zhí)行效率。 2.Request對象的方法Request對象的方法如表14-4所示。 表14-4 Request對象的方法
實例14-6:獲取文件的物理路徑 Request.MapPath("FileName"); 可以通過這條語句來得到某個文件的實際物理位置,這個方法常常用在需要使用實際路徑的地方。 14.1.3 Application對象Application對象是HttpApplicationState類的一個實例。 HttpApplicationState類的單個實例,將在客戶端第一次從某個特定的ASP.NET應(yīng)用程序虛擬目錄中請求任何URL資源時創(chuàng)建。對于Web服務(wù)器上的每個ASP.NET應(yīng)用程序,都要創(chuàng)建一個單獨的實例。然后通過內(nèi)部Application對象公開對每個實例的引用。Application對象有如下特點: — 數(shù)據(jù)可以在Application對象內(nèi)部共享,因此一個Application對象可以覆蓋多個用戶。 — 一個Application對象包含事件,可以觸發(fā)某些Applicatin對象腳本。 — 個別Application對象可以用Internet Service Manager來設(shè)置而獲得不同屬性。 — 單獨的Application對象可以隔離出來在它們自己的內(nèi)存中運行,這就是說,如果一個人的Application遭到破壞,就不會影響其他人。 — 可以停止一個Application對象(將其所有組件從內(nèi)存中驅(qū)除)而不會影響到其他應(yīng)用程序。 一個網(wǎng)站可以有不止一個Application對象。典型情況下,可以針對個別任務(wù)的一些文件創(chuàng)建個別的Application對象。例如,可以建立一個Application對象來適用于全部公用用戶,而再創(chuàng)建另外一個只適用于網(wǎng)絡(luò)管理員的Application對象。 Application對象使給定應(yīng)用程序的所有用戶之間共享信息,并且在服務(wù)器運行期間持久地保存數(shù)據(jù)。因為多個用戶可以共享一個Application對象,所以必須要有Lock和Unlock方法,以確保多個用戶無法同時改變某一屬性。Application對象成員的生命周期止于關(guān)閉IIS或使用Clear方法清除。 1.Application對象的屬性Application對象的屬性如表14-5所示。 表14-5 Application對象的屬性
2.Application對象的方法Application對象的方法如表14-6所示。 表14-6 Application對象的方法
使用Application對象的語法如下所示: Application("變量名")="變量值" 實例14-7:設(shè)置、獲取Application對象的內(nèi)容 代碼如下: <script language="C#" runat="server"> void Page_Load(object sender, System.EventArgs e) { Application.Add("App1","Value1"); Application.Add("App2","Value2"); Application.Add("App3","Value3");
int N; for(N=0;N<Application.Count;N++) { Response.Write("變量名:"+ Application.GetKey(N)); Response.Write("變量值:"+ Application.Get(N) +"<br>"); } Application.Clear(); } </script> 在本例中,首先通過Add方法添加三個Application對象,并賦以初值,接著通過Count屬性得到Application對象的數(shù)量,然后通過循環(huán)操作GetKey方法和Get方法分別得到新增對象的“索引”和“索引”所對應(yīng)的“值”。 執(zhí)行上面代碼,得到如下結(jié)果: 變量名:App1變量值:Value1 變量名:App2變量值:Value2 變量名:App3變量值:Value3 實例14-8:Application對象的加鎖與解鎖 Lock方法可以阻止其他客戶修改存儲在Application對象中的變量,以確保在同一時刻僅有一個客戶可修改和存取Application變量。如果用戶沒有明確調(diào)用Unlock方法,則服務(wù)器將在頁面文件結(jié)束或超時即可解除對Application對象的鎖定。 Unlock方法可以使其他客戶端在使用Lock方法鎖住Application對象后,修改存儲在該對象中的變量。如果未顯式地調(diào)用該方法,Web服務(wù)器將在頁面文件結(jié)束或超時后解鎖Application對象。 使用方法如下: Application.Lock(); Application["變量名"]="變量值"; Application.UnLock(); 14.1.4 Session對象Session對象是HttpSessionState的一個實例。該類為當(dāng)前用戶會話提供信息,還提供對可用于存儲信息的會話范圍的緩存的訪問,以及控制如何管理會話的方法。 Session的發(fā)明是填補HTTP協(xié)議的局限,HTTP協(xié)議工作過程是,用戶發(fā)出請求,服務(wù)器端做出響應(yīng),這種用戶端和服務(wù)器端之間的聯(lián)系都是離散的,非連續(xù)的。在HTTP協(xié)議中沒有什么能夠允許服務(wù)器端來跟蹤用戶請求的。在服務(wù)器端完成響應(yīng)用戶的請求后,服務(wù)器端不能持續(xù)與該瀏覽器保持連接。從網(wǎng)站的觀點上看,每一個新的請求都是單獨存在的,因此,當(dāng)用戶在多個主頁間轉(zhuǎn)換時,就根本無法知道他的身份。 可以使用Session對象存儲特定用戶會話所需的信息。這樣,當(dāng)用戶在應(yīng)用程序的Web頁之間跳轉(zhuǎn)時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。 當(dāng)用戶請求來自應(yīng)用程序的Web頁時,如果該用戶還沒有會話,則Web服務(wù)器將自動創(chuàng)建一個Session對象。當(dāng)會話過期或被放棄后,服務(wù)器將中止該會話。 當(dāng)用戶第一次請求給定的應(yīng)用程序中的aspx文件時,ASP.NET將生成一個SessionID。SessionID是由一個復(fù)雜算法生成的號碼,它唯一標(biāo)識每個用戶會話。在新會話開始時,服務(wù)器將Session ID作為一個cookie存儲在用戶的Web瀏覽器中。 在將SessionID cookie存儲于用戶的瀏覽器之后,即使用戶請求了另一個.aspx文件,或請求了運行在另一個應(yīng)用程序中的.aspx文件,ASP.NET仍會重用該cookie跟蹤會話。與此相似,如果用戶故意放棄會話或讓會話超時,然后再請求另一個.aspx文件,那么ASP.NET將以同一個cookie開始新的會話。只有當(dāng)服務(wù)器管理員重新啟動服務(wù)器,或用戶重新啟動Web瀏覽器時,此時存儲在內(nèi)存中的SessionID設(shè)置才被清除,用戶將會獲得新的SessionID cookie。 通過重用SessionID cookie,Web應(yīng)用程序?qū)l(fā)送給用戶瀏覽器的cookie數(shù)量降為最低。另外,如果用戶決定該Web應(yīng)用程序不需要會話管理,就可以不讓W(xué)eb應(yīng)用程序跟蹤會話和向用戶發(fā)送SessionID。 Session對象最常見的一個用法就是存儲用戶的首選項。例如,如果用戶指明不喜歡查看圖形,另外其還經(jīng)常被用在鑒別客戶身份的程序中。要注意的是,會話狀態(tài)僅在支持cookie的瀏覽器中保留,如果客戶關(guān)閉了cookies選項,Session也就不能發(fā)揮作用了。 ASP.NET的Sessions非常好用,能夠利用Session對象來對Session全面控制,如果需要在一個用戶的Session中存儲信息,只需要簡單地直接調(diào)用Session對象就可以了,下面就是個例子: Session("Myname")=Response.form("Username"); Session("Mycompany")=Response.form("Usercompany"); 應(yīng)注意的是,Session對象是與特定用戶相聯(lián)系的。針對某一個用戶賦值的Session對象是和其他用戶的Session對象完全獨立的,不會相互影響。換句話說,這里面針對每一個用戶保存的信息是每一個用戶自己獨享的,不會產(chǎn)生共享情況。 很明顯,對于不同的用戶,Session對象的Myname變量和Mycompany變量各自是不同的,當(dāng)每個人在網(wǎng)站的不同主頁間瀏覽時,這種針對個人的變量會一直保留,這樣作為身份認(rèn)證是十分有效的。 1.Session對象的屬性Session對象的屬性如表14-7所示。 表14-7 Session對象的屬性
實例14-9:獲取Session對象的個數(shù) Count屬性可以幫助統(tǒng)計正在使用的Session對象的個數(shù),語句非常簡單,示例如下: Response.Write(Session.Count); 實例14-10:設(shè)置Session對象的生存期 每一個客戶端連接服務(wù)器后,服務(wù)器端都要建立一個獨立的Session,并且需要分配額外的資源來管理這個Session,但如果客戶端因某些原因,例如,去忙其他的工作,停止了任何操作,但沒有關(guān)閉瀏覽器,那么這種情況下,服務(wù)器端依然會消耗一定的資源來管理Session,這就造成了對服務(wù)器資源的浪費,降低了服務(wù)器的效率。所以,可以通過設(shè)置Session生存期,以減少這種對服務(wù)器資源的浪費。 要更改Session的有效期限,只要設(shè)定TimeOut屬性即可;TimeOut屬性的默認(rèn)值是20分鐘。 <Html> <Form Runat="Server" ID="Form1"> <Asp:Button Id="Button1" Text="演示" OnClick="Button1_Click" Runat="Server" /> 目前時間:<Asp:Label Id="Label1" Runat="Server" /> <P> 第一個Session的值:<Asp:Label Id="Label2" Runat="Server" /><Br> 第二個Session的值:<Asp:Label Id="Label3" Runat="Server" /><Br> </Form> <Script Language="c#" Runat="Server"> void Page_Load(object sender, System.EventArgs e) { if(!Page.IsPostBack) { Session["Session1"]="Value1"; Session["Session2"]="Value2"; Session.Timeout=1; DateTime now=DateTime.Now; string format="HH:mm:ss"; Label1.Text=now.ToString(format); Label2.Text=Session["Session1"].ToString(); Label3.Text=Session["Session2"].ToString(); } } void Button1_Click(object sender, System.EventArgs e) { DateTime now=DateTime.Now; string format="HH:mm:ss"; Label1.Text=now.ToString(format); Label2.Text=Session["Session1"].ToString(); Label3.Text=Session["Session2"].ToString(); } </Script> </Html> 在本例中,通過Timeout屬性設(shè)置了Session的生存期為1分鐘。運行上面代碼,顯示結(jié)果如圖14-2所示。 圖14-2 設(shè)置Session對象的生存期 一分鐘后,單擊“演示”按鈕,頁面會出現(xiàn)錯誤,提示 Label2.Text=Session["Session1"].ToString(); Label3.Text=Session["Session2"].ToString(); 這兩句代碼錯誤,為什么會這樣呢?原因就在于,Session的生存期限超過了一分鐘,已經(jīng)無法獲得Session["Session1"]和Session["Session2"]的值。 2.Session對象的方法Session對象的方法如表14-8所示: 表14-8 Session對象的方法
實例14-11:通過Add方法設(shè)置Session對象 通過Add方法可以設(shè)置Session對象的值,語法如下: Session.Add("變量名",變量值); 在具體應(yīng)用中,可以這樣使用: int userId = 1; string userName = "test"; string userPwd = "sdgtrertkl"; Session.Add("userId",userId); Session.Add("userName", userName); Session.Add("userPwd", userPwd); 在上面例子中創(chuàng)建了userId,userName,userPwd三個Session來存儲用戶的登錄信息。程序隨時都可以通過這三個Session對象來查看用戶的連接狀態(tài),這是實際的項目中最常見的Session應(yīng)用。 需要注意的是,也可以不使用Add方法來設(shè)置Session對象,語法如下: Session["變量名"]=變量值; 這樣,上面的例子就可以改為: Session["userId"] = userId; Session["userName"] = userName; Session["userPwd"] = userPwd; 需要指出的是,以上兩種語句在作用上是相同的,讀者可以根據(jù)自己的習(xí)慣來使用。 14.1.5 Server對象Server對象是HttpServerUtility的一個實例。該對象提供對服務(wù)器上的方法和屬性的訪問。 1.Server對象的屬性Server對象的屬性如表14-9所示: 表14-9 Server對象的屬性
實例14-12:返回服務(wù)器計算機(jī)名稱 通過Server對象的MachineName屬性來獲取服務(wù)器計算機(jī)的名稱,示例如下: <Script Language="c#" Runat="Server"> void Page_Load(object sender, System.EventArgs e) { String ThisMachine; ThisMachine = Server.MachineName; Response.Write(ThisMachine); } </Script> 實例14-13:設(shè)置客戶端請求的超時期限 用法如下: Server.ScriptTimeout = 60; 本例中,將客戶端請求超時期限設(shè)置為60秒,如果60秒內(nèi)沒有任何操作,服務(wù)器將斷開與客戶端的連接。 2.Server對象的方法Server對象的方法如表14-10所示: 表14-10 Server對象的方法
實例14-14:利用HtmlEncode和HtmlDecode方法對網(wǎng)頁內(nèi)容編碼 當(dāng)想在網(wǎng)頁上顯示HTML標(biāo)簽時,若在網(wǎng)頁中直接輸出則會被瀏覽器解譯為HTML的內(nèi)容,所以要通過Server對象的HtmlEncode方法將它編碼再輸出;若要將編碼后的結(jié)果譯碼回原本的內(nèi)容,則使用HtmlDecode方法。下列程序代碼范例使用HtmlEncode方法將“<B>HTML內(nèi)容</B>”編碼后輸出至瀏覽器,再利用HtmlDecode方法將把編碼后的結(jié)果譯碼還原: <html> <Script Language="c#" Runat="Server"> void Page_Load(object sender, System.EventArgs e) { String strHtmlContent; strHtmlContent=Server.HtmlEncode("<B>HTML 內(nèi)容</B>"); Response.Write(strHtmlContent); Response.Write("<P>"); strHtmlContent=Server.HtmlDecode(strHtmlContent); Response.Write(strHtmlContent); } </Script> </html> 運行上述示例輸出結(jié)果可以發(fā)現(xiàn),編碼后的HTML標(biāo)注變成了“<B>HTML內(nèi)容</B>”,這是因為“<B>”變成了“<B>”,“</B>”變成了“</B>”,所以才能在頁面中顯示HTML標(biāo)注。 實例14-15:使用URLEncode方法對URL進(jìn)行編碼 就像HTMLEncode方法使客戶可以將字符串翻譯成可接受的HTML格式一樣,Server對象的URLEncode方法可以根據(jù)URL規(guī)則對字符串進(jìn)行正確編碼。當(dāng)字符串?dāng)?shù)據(jù)以URL的形式傳遞到服務(wù)器時,在字符串中不允許出現(xiàn)空格,也不允許出現(xiàn)特殊字符。為此,如果希望在發(fā)送字符串之前進(jìn)行URL編碼,則可以使用Server. URLEncode方法。 該函數(shù)已被重載,語法如下: 對字符串進(jìn)行URL編碼,并返回已編碼的字符串。 public string UrlEncode(string); URL對字符串進(jìn)行編碼,并將結(jié)果輸出發(fā)送到TextWriter輸出流。 public void UrlEncode(string, TextWriter); 例如下面例子: <%Response.Write(Server.URLEncode("http://www.microsoft.com"))%> 產(chǎn)生如下輸出: http %3A%2F%2Fwww%2Emicrosoft%2Ecom 利用QueryString在不同主頁間傳遞信息時,如果信息帶有空格或特殊字符,那么必須進(jìn)行Encode操作,因為如果不這樣做,很可能使得接受信息的那邊接受到一些所不期望的奇怪字符串。注意,不要對QueryString的名稱及等號進(jìn)行Encode操作,只需要將其值進(jìn)行Encode操作就可以了。 進(jìn)行了Encode操作后,效果如下: Message=This+Query+String+has+been+URL+ENCODED%2E 用戶并不需要考慮對上面的字符串再進(jìn)行解碼,會自動進(jìn)行這樣的處理。例如,假設(shè)有這樣的腳本: Request.QueryString("message"); 這時,顯示結(jié)果為: This Query String has been URL encoded 實例14-16:建立虛擬路徑與服務(wù)器物理目錄間映射 使用MapPath方法可以將指定的相對或虛擬路徑映射到服務(wù)器上相應(yīng)的物理目錄上。 語法: public string MapPath(string path); 參數(shù)Path表示指定要映射物理目錄的相對或虛擬路徑。若Path以一個正斜杠(/)或反斜杠(\)開始,則MapPath方法返回路徑時將Path視為完整的虛擬路徑。若Path不是以斜杠開始,則MapPath方法返回同頁面文件中已有的路徑相對的路徑。這里需要注意的是,MapPath方法不檢查返回的路徑是否正確或在服務(wù)器上是否存在。 對于下列示例,文件data.txt和包含下列腳本的test.aspx文件都位于目錄C:\Inetpub\ wwwroot\aspx下。C:\Inetpub\wwwroot目錄被設(shè)置為服務(wù)器的宿主目錄。下列示例使用服務(wù)器變量PATH_INFO映射當(dāng)前文件的物理路徑。以下腳本: Server.mappth(Request. ServerVariables("PATH_INFO")); 輸出: c:\inetpub\wwwroot\asp\test.aspx 由于下列示例中的路徑參數(shù)不是以斜杠字符開始的,所以它們被相對映射到當(dāng)前目錄,此處是目錄C:\Inetpub\wwwroot\aspx。以下腳本: Server.mappath("data.txt"); Server.mappath("aspx/data.txt"); 輸出: c:\inetpub\wwwroot\aspx\data.txt c:\inetpub\wwwroot\aspx\aspx\data.txt 14.1.6 Cookie對象什么是Cookie呢?Cookie 是一小段文本信息,伴隨著用戶請求和頁面在Web服務(wù)器和瀏覽器之間傳遞。用戶每次訪問站點時,Web應(yīng)用程序都可以讀取Cookie包含的信息。 Cookie跟Session、Application類似,也是用來保存相關(guān)信息,但Cookie和其他對象的最大不同是,Cookie將信息保存在客戶端,而Session和Application是保存在服務(wù)器端。也就是說,無論何時用戶連接到服務(wù)器,Web站點都可以訪問cookie信息。這樣,既方便用戶的使用,也方便了網(wǎng)站對用戶的管理。 ASP.NET包含兩個內(nèi)部Cookie集合。通過HttpRequest的Cookies集合訪問的集合包含通過Cookie標(biāo)頭從客戶端傳送到服務(wù)器的Cookie。通過HttpResponse的Cookies集合訪問的集合包含一些新Cookie,這些Cookie在服務(wù)器上創(chuàng)建并以Set-Cookie標(biāo)頭的形式傳輸?shù)娇蛻舳恕?/p> Cookie不是Page類的子類,所以在使用方法上跟Seesion和Application不同。 使用Cookie的優(yōu)點: — 可配置到期規(guī)則。Cookie 可以在瀏覽器會話結(jié)束時到期,或者可以在客戶端計算機(jī)上無限期存在,這取決于客戶端的到期規(guī)則。 — 不需要任何服務(wù)器資源。Cookie存儲在客戶端并在發(fā)送后由服務(wù)器讀取。 — 簡單性。Cookie是一種基于文本的輕量結(jié)構(gòu),包含簡單的鍵值對。 — 數(shù)據(jù)持久性。雖然客戶端計算機(jī)上Cookie的持續(xù)時間取決于客戶端上的Cookie過期處理和用戶干預(yù),Cookie通常是客戶端上持續(xù)時間最長的數(shù)據(jù)保留形式。 使用Cookie的缺點: — 大小受到限制。大多數(shù)瀏覽器對Cookie的大小有4096字節(jié)的限制,盡管在當(dāng)今新的瀏覽器和客戶端設(shè)備版本中,支持8192字節(jié)的Cookie大小已越發(fā)常見。 — 用戶配置為禁用。有些用戶禁用了瀏覽器或客戶端設(shè)備接收Cookie的能力,因此限制了這一功能。 — 潛在的安全風(fēng)險。Cookie可能會被篡改。用戶可能會操縱其計算機(jī)上的Cookie,這意味著會對安全性造成潛在風(fēng)險,或者導(dǎo)致依賴于Cookie的應(yīng)用程序失敗。另外,雖然Cookie只能將它們發(fā)送到客戶端的域訪問,歷史上黑客已經(jīng)發(fā)現(xiàn)從用戶計算機(jī)上的其他域訪問Cookie的方法。可以手動加密和解密Cookie,但這需要額外的編碼,并且因為加密和解密需要耗費一定的時間而影響應(yīng)用程序的性能。 1.Cookie對象的屬性Cookie對象的屬性如表14-11所示: 表14-11 Cookie對象的屬性
2.Cookie對象的方法Cookie對象的方法如表11-12所示: 表14-12 Cookie對象的方法
實例14-17:設(shè)置Cookie 下面的示例將創(chuàng)建名為“LastVisit”的新Cookie,將該Cookie的值設(shè)置為當(dāng)前日期和時間,并將其添加到當(dāng)前Cookie集合中,所有Cookie均通過HTTP輸出流在Set-Cookie頭中發(fā)送到客戶端。 HttpCookie MyCookie = new HttpCookie("LastVisit"); DateTime now = DateTime.Now; MyCookie.Value = now.ToString(); MyCookie.Expires = now.AddHours(1); Response.Cookies.Add(MyCookie); 運行上面例子,將會在用戶機(jī)器的Cookies目錄下建立如下內(nèi)容的文本文件: mycookie LastVisit 盡管上面的這個例子很簡單,但可以從中擴(kuò)展許多富有創(chuàng)造性的應(yīng)用程序。 實例14-18:獲取客戶端發(fā)送的Cookie信息 下面的示例是依次通過客戶端發(fā)送的所有Cookie,并將每個Cookie的名稱、過期日期、安全參數(shù)和值發(fā)送到HTTP輸出。 int loop1, loop2; HttpCookieCollection MyCookieColl; HttpCookie MyCookie; MyCookieColl = Request.Cookies; //把所有的cookie名放到一個字符數(shù)組中 String[] arr1 = MyCookieColl.AllKeys; //用cookie名獲取單個cookie對象 for (loop1 = 0; loop1 < arr1.Length; loop1++) { MyCookie = MyCookieColl[arr1[loop1]]; Response.Write("Cookie: " + MyCookie.Name + "<br>"); Response.Write("Expires: " + MyCookie.Expires + "<br>"); Response.Write ("Secure:" + MyCookie.Secure + "<br>"); //將單個cookie的值放入一個對象數(shù)組 String[] arr2 = MyCookie.Values.AllKeys; //遍歷cookie值集合打印所有值 for (loop2 = 0; loop2 < arr2.Length; loop2++) { Response.Write("Value" + loop2 + ": " + arr2[loop2] + "<br>"); } 14.1.7 Cache對象對于每個應(yīng)用程序域均創(chuàng)建該類的一個實例,并且只要對應(yīng)的應(yīng)用程序域保持活動,該實例便保持有效。有關(guān)此類實例的信息通過HttpContext對象的Cache屬性或Page對象的Cache屬性來提供。 1.Cache對象的屬性Cache對象的屬性如表14-13所示: 表14-13 Cache對象的屬性
2.Cache對象的方法Cache對象的方法如表14-14所示: 表14-14 Cache對象的屬性
實例14-19:檢索為ASP.NET文本框服務(wù)器控件緩存的值 Get方法可以從Cache對象檢索指定項,其唯一的參數(shù)key表示要檢索的緩存項的標(biāo)識符。該方法返回檢索到的緩存項,未找到該鍵時為空引用。 下面的示例展示如何檢索為ASP.NET文本框服務(wù)器控件緩存的值。 Cache.Get("MyTextBox.Value"); 實例14-20:移除Cache對象 Remove方法可以從應(yīng)用程序的Cache對象移除指定項,其唯一的參數(shù)key表示要移除的緩存項的String標(biāo)識符。該方法返回從Cache移除的項。如果未找到鍵參數(shù)中的值,則返回空引用。 下面的示例創(chuàng)建一個RemoveItemFromCache函數(shù)。調(diào)用此函數(shù)時,它使用Item屬性檢查緩存中是否包含與Key1鍵值相關(guān)的對象。如果包含,則調(diào)用Remove方法來移除該對象。 public void RemoveItemFromCache(Object sender, EventArgs e) { if(Cache["Key1"] != null) Cache.Remove("Key1"); } 14.1.8 Global.asax除了編寫界面代碼外,開發(fā)人員還可以將邏輯和事件處理代碼添加到他們的Web應(yīng)用程序中。此代碼不處理界面的生成,并且一般不為響應(yīng)個別頁請求而被調(diào)用。相反,它負(fù)責(zé)處理更高級別的應(yīng)用程序事件,如Application_Start,Application_End,Session_Start,Session_End等。開發(fā)人員使用位于特定Web應(yīng)用程序虛擬目錄樹根處的Global.asax文件來創(chuàng)作此邏輯。第一次激活或請求應(yīng)用程序命名空間內(nèi)的任何資源或URL時,ASP.NET自動分析該文件并將其編譯成動態(tài).NET框架類(此類擴(kuò)展了HttpApplication基類)。 第一次激活或請求應(yīng)用程序命名空間內(nèi)的任何資源URL時,ASP.NET分析Global.asax文件并將其動態(tài)編譯成.NET框架類。Global.asax文件被配置為自動拒絕任何直接URL請求,從而使外部用戶不能下載或查看內(nèi)部代碼。 通過在Global.asax文件中創(chuàng)作符合命名模式“Application_EventName(Appropriate EventArgumentSignature)”的方法,開發(fā)人員可以為HttpApplication基類的事件定義處理程序。例如: <script language="C#" runat="server"> void Application_Start(object sender, EventArgs e) { // Application startup code goes here } </script> 如果事件處理代碼需要導(dǎo)入附加的命名空間,可以在.aspx頁中使用@ import指令,如下所示: <%@ Import Namespace="System.Text" %> 第一次打開頁時,引發(fā)應(yīng)用程序和會話的Start事件: void Application_Start(object sender, EventArgs e) { // Application startup code goes here } void Session_Start(object sender, EventArgs e) { Response.Write("Session is Starting...<br>"); Session.Timeout = 1; } 對每個請求都引起B(yǎng)eginRequest和EndRequest事件。刷新頁時,只顯示來自Begin-Request,EndRequest和Page_Load方法的消息。 靜態(tài)對象、.NET框架類和COM組件都可以使用對象標(biāo)記在Global.asax文件中定義。范圍可以是appinstance,session或application。appinstance范圍表示對象特定于Http-Application的一個實例并且不共享。 <object id="id" runat="server" class=".NET Framework class Name" scope=" appinstance"/> <object id="id" runat="server" progid="COM ProgID" scope="session"/> <object id="id" runat="server" classid="COM ClassID" scope="application"/> 請注意,Global.asax使用了微軟的HTML拓展<SCRIPT>標(biāo)記語法來限制腳本,這也就是說,必須用<SCRIPT>標(biāo)記來引用這兩個事件而不能用<%和%>符號引用。在Global.asax中不能有任何輸出語句,無論HTM的語法還是Response.Write方法都是不行的,Global.asax是任何情況下也不能進(jìn)行顯示的。 網(wǎng)上看到的 很好就貼了過來 |
|