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