一、Response對象
Response對象是HttpResponse類的一個實例。該類主要是封裝來自ASP.NET操作的HTTP響應信息。
1、Response對象的屬性
屬 性 |
說 明
|
屬 性 值
|
BufferOutput | 獲取或設置一個值,該值指示是否緩衝輸出,並在完成處理整個頁之後將其發送 | 如果緩衝了到客戶端的輸出,則爲true;否則爲false。默認爲true |
屬 性 |
說 明
|
屬 性 值
|
Cache | 獲取Web頁的緩存策略(過期時間、保密性、變化子句) | 包含有關當前響應的緩存策略信息的HttpCachePolicy對象 |
Charset | 獲取或設置輸出流的HTTP字符集 | 輸出流的HTTP字符集 |
IsClientConnected | 獲取一個值,通過該值指示客戶端是否仍連接在服務器上 | 如果客戶端當前仍在連接,則爲true;否則爲false |
由於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的值。下表列舉了幾個常用的方法。
Response對象的方法
方 法 |
說 明
|
Write
|
將指定的字符串或表達式的結果寫到當前的HTTP輸出 |
End
|
停止頁面的執行並得到相應結果 |
Clear
|
用來在不將緩存中的內容輸出的前提下,清空當前頁的緩存,僅當使用了緩存輸出時,纔可以利用Clear方法 |
Flush
|
將緩存中的內容立即顯示出來。該方法有一點和Clear方法一樣,它在腳本前面沒有將Buffer屬性設置爲True時會出錯。和End方法不同的是,該方法調用後,該頁面可繼續執行 |
Redirect
|
使瀏覽器立即重定向到程序指定的URL |
Response對象的方法
方 法 |
說 明
|
Write
|
將指定的字符串或表達式的結果寫到當前的HTTP輸出 |
End
|
停止頁面的執行並得到相應結果 |
Clear
|
用來在不將緩存中的內容輸出的前提下,清空當前頁的緩存,僅當使用了緩存輸出時,纔可以利用Clear方法 |
Flush
|
將緩存中的內容立即顯示出來。該方法有一點和Clear方法一樣,它在腳本前面沒有將Buffer屬性設置爲True時會出錯。和End方法不同的是,該方法調用後,該頁面可繼續執行 |
Redirect
|
使瀏覽器立即重定向到程序指定的URL |
實例:使用Response.write,向客戶端發送信息
for(int i=1;i<=500;i++)
{
Response.Write("i= "+i+"<BR>");
}
本例使用“write”方法,向屏幕輸出500個值。
實例:使用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="計算該值的平方值" οnclick="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>
運行上面的代碼,結果如圖所示。
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()”刪掉。
實例:使用Redirect方法進行頁面重定向
在網頁編程中,經常會遇到在程序執行到某個位置進行頁面調轉的情況。Response.Redirect方法可以滿足這種需求,例如代碼:
Response.Redirect("http://www.163.com");
執行該代碼,頁面將跳轉到網易163的主頁。
二、 Request對象
Request對象是HttpRequest類的一個實例。它能夠讀取客戶端在Web請求期間發送的HTTP值。
Request對象的屬性
Request對象的屬性如表14-3所示。
表14-3 Request對象的屬性
屬 性 |
說 明
|
屬 性 值
|
QueryString | 獲取 HTTP 查詢字符串變量集合 | NameValueCollection對象 |
Path | 獲取當前請求的虛擬路徑 | 當前請求的虛擬路徑 |
UserHostAddress | 獲取遠程客戶端的 IP 主機地址 | 遠程客戶端的IP地址 |
Browser | 獲取有關正在請求的客戶端的瀏覽器功能的信息 | HttpBrowserCapabilities對象 |
程序中,經常可以使用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 中的虛擬路徑映射到服務器上的物理路徑 |
Request.MapPath("FileName");
可以通過這條語句來得到某個文件的實際物理位置,這個方法常常用在需要使用實際路徑的地方。
三、 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 |
Application對象的方法如表14-6所示。
表14-6 Application對象的方法
方 法 |
說 明
|
Add | 新增一個新的Application對象變量 |
Clear | 清除全部的Application對象變量 |
Get | 使用索引關鍵字或變數名稱得到變量值 |
GetKey | 使用索引關鍵字來獲取變量名稱 |
Lock | 鎖定全部的Application變量 |
Remove | 使用變量名稱刪除一個Application對象 |
RemoveAll | 刪除全部的Application對象變量 |
Set | 使用變量名更新一個Application對象變量的內容 |
UnLock | 解除鎖定的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();
四、 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 |
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所示。
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 | 清除所有會話狀態值 |
通過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;
需要指出的是,以上兩種語句在作用上是相同的,讀者可以根據自己的習慣來使用。
五、 Server對象
Server對象是HttpServerUtility的一個實例。該對象提供對服務器上的方法和屬性的訪問。
1.Server對象的屬性
Server對象的屬性如表14-9所示:
表14-9 Server對象的屬性
屬 性 |
說 明
|
屬 性 值
|
MachineName | 獲取服務器的計算機名稱 | 本地計算機的名稱 |
ScriptTimeout | 獲取和設置請求超時 | 請求的超時設置(以秒計) |
通過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傳輸 |
當想在網頁上顯示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
六、 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狀態維護版本 |
Cookie對象的方法如表11-12所示:
表14-12 Cookie對象的方法
方 法 |
說 明
|
Add | 新增一個Cookie變量 |
Clear | 清除Cookie集合內的變量 |
Get | 通過變量名或索引得到Cookie的變量值 |
GetKey | 以索引值來獲取Cookie的變量名稱 |
Remove | 通過Cookie變量名來刪除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>");
}
七、 Cache對象
對於每個應用程序域均創建該類的一個實例,並且只要對應的應用程序域保持活動,該實例便保持有效。有關此類實例的信息通過HttpContext對象的Cache屬性或Page對象的Cache屬性來提供。
1.Cache對象的屬性
Cache對象的屬性如表14-13所示:
表14-13 Cache對象的屬性
屬 性 |
說 明
|
屬 性 值
|
Count | 獲取存儲在緩存中的項數。當監視應用程序性能或使用ASP.NET跟蹤功能時,此屬性可能非常有用 | 存儲在緩存中的項數 |
Item | 獲取或設置指定鍵處的緩存項 | 表示緩存項的鍵的String對象 |
Cache對象的方法如表14-14所示:
表14-14 Cache對象的屬性
方 法 |
說 明
|
Add | 將指定項添加到 Cache 對象,該對象具有依賴項、過期和優先級策略,以及一個委託(可用於在從 Cache 移除插入項時通知應用程序) |
Get | 從 Cache 對象檢索指定項 |
Remove | 從應用程序的 Cache 對象移除指定項 |
Insert | 向Cache對象插入項。使用此方法的某一版本改寫具有相同key參數的現有Cache項 |
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");
}