1. HTTP請求 Request對象
1.1. Request對象常用屬性和方法
Request對象是HttpRequest類的一個實例, 它提供對當前頁請求的訪問,其中包括User-Agent、Address、Cookie、客戶端證書、查詢字符串等信息,用戶可以使用該類來讀取瀏覽器發送到服務器的內容。
部分常用的Request類的屬性和方法
名稱 | 說明 |
---|---|
Browser屬性 | 用於請求的瀏覽器信息 |
QueryString屬性 | 用於獲取瀏覽器向服務器傳遞的鍵值對參數 |
Cookies屬性 | 獲取客戶端發送的cookie集合 |
UserHostName屬性 | 用戶主機名稱 |
UserHostAddress屬性 | 用戶主機IP |
UserAgent屬性 | 用戶的訪問代理 |
Ur屬性l | 要訪問的地址 |
MapPath(String)方法 MapPath(String,String,Boolean)方法 |
將虛擬地址轉換爲物理地址 |
SaveAs | 將Http請求保存到磁盤 |
完整的Request屬性和方法種類繁多,可以在這個頁面詳細查看:.NET HttpRequest類
例如下面的代碼:
protected void Page_Load(object sender, EventArgs e){
Response.Write("客戶端的信息:</br>");
Response.Write("發出請求的主機名稱:" + Request.UserHostName + "</br>");
Response.Write("發出請求的主機IP:" + Request.UserHostAddress + "</br>");
Response.Write("發出請求的主機的User-Agent:" + Request.UserAgent + "</br>");
Response.Write("請求訪問的地址:" + Request.Url + "</br>");
}
結果如圖所示,由於是本地訪問,因此主機名稱和IP顯示爲::1
:
1.2. 獲取頁面間傳送的值
在ASP.NET中,可以使用QueryString屬性或者Params屬性來獲取頁面間傳送的值,它可以獲取http請求中攜帶的鍵值對。例如如果請求爲:
http://www.contoso.com/default.aspx?id=13408&name=FadiFakhouri
則QueryString或Params的值爲
id=13408,fullname=FadiFakhouri
這時如果要根據鍵把值取出,則可用下面代碼:
String id = Request.QueryString["id"];
String name = Request.QueryString["name"];
// 或
String id = Request.Params["id"];
String name = Request.Params["name"];
此時服務器即獲取到了http請求傳入的屬性id和name的值
1.3. 獲取客戶端瀏覽器相關信息
在ASP.NET中,可以使用Browser屬性來獲取客戶端瀏覽器相關信息,該屬性返回一個HttpBrowserCapabilities對象,這個對象記錄了瀏覽器相關的信息
例如下面的代碼,通過HttpBrowserCapabilities 讀取瀏覽器的信息:
protected void Page_Load(object sender, EventArgs e){
HttpBrowserCapabilities hbc = Request.Browser;
Response.Write("客戶端瀏覽器的信息:</br>");
Response.Write("瀏覽器類型:" + hbc.Type + "</br>");
Response.Write("瀏覽器名稱:" + hbc.Browser + "</br>");
Response.Write("瀏覽器版本:" + hbc.Version + "</br>");
Response.Write("瀏覽器支持的主版本號" + hbc.MajorVersion + "<br>");
Response.Write("瀏覽器支持的兼容版本號" + hbc.MinorVersion + "<br>");
Response.Write("瀏覽器是否爲Beta測試版本:" + hbc.Beta + "<br>");
Response.Write("瀏覽器是否爲爬蟲程序:" + hbc.Crawler + "<br>");
Response.Write("瀏覽器是否爲AOL瀏覽器:" + hbc.AOL + "<br>");
Response.Write("瀏覽器是否運行在Win16計算機上:" + hbc.Win16 + "<br>");
Response.Write("瀏覽器是否運行在Win32計算機上:" + hbc.Win32 + "<br>");
Response.Write("瀏覽器操作平臺:" + hbc.Platform + "</br>");
Response.Write("瀏覽器是否支持框架:" + hbc.Frames + "</br>");
Response.Write("瀏覽器是否支持表格:" + hbc.Tables + "</br>");
Response.Write("瀏覽器是否支持Cookie:" + hbc.Cookies + "</br>");
Response.Write("瀏覽器是否支持VB:" + hbc.VBScript + "<br>");
Response.Write("瀏覽器是否支持JavaScript:" + hbc.JavaScript + "<br>");
Response.Write("瀏覽器是否支持Applets:" + hbc.JavaApplets + "<br>");
Response.Write("瀏覽器是否支持ActiveX:" + hbc.ActiveXControls + "<br>");
Response.Write("瀏覽器是否支持用於網絡廣播頻道定義格式(CDF):" + hbc.CDF + " <br>");
}
結果爲:
2. HTTP響應 Response對象
2.1. Response對象常用屬性和方法
Response對象用於將數據從服務器發送回瀏覽器,它允許將數據作爲請求的結果發送到瀏覽器中,並提供有關響應的信息,另外,它還可以用來在頁面中輸入數據、跳轉或者傳遞頁面中的參數。
部分常用的Response類的屬性和方法
名稱 | 說明 |
---|---|
Write方法 | 將數據輸出到客戶端 |
WriteFile方法 | 將指定的文件寫入HTTP內容輸出流 |
Redirect方法 | 用於ASP.NET頁面的跳轉 |
完整的Response屬性和方法種類繁多,可以在這個頁面詳細查看:.NET HttpResponse類
2.2. 在頁面中輸出指定信息數據
使用Write方法和WriteFile方法可以在.asp頁面中輸出數據,可以輸出的數據包括:字符、字符串、字符數組、對象和文件
例如下面的代碼:
protected void Page_Load(object sender, EventArgs e){
// 輸出字符
char ch = 'a';
Response.Write("輸出單個字符:" + ch + "</br>");
// 輸出字符串
String str = "abcd";
Response.Write("輸出字符串:" + str + "</br>");
// 輸出字符數組的類型和內容
char[] chArray = {'a', 'c', 'e', 'g', 'i' };
Response.Write("輸出字符數組:" + chArray + "</br>");
Response.Write(chArray, 0, chArray.Length);
Response.Write("</br>");
// 輸出對象類型
Page page = new Page();
Response.Write("輸出一個對象:" + page + "</br>");
// 輸出文件路徑和內容
Response.Write("輸出文件:" + Server.MapPath("TextFile1.txt") + "</br>");
Response.WriteFile(Server.MapPath("TextFile1.txt"));
}
結果爲:
2.3. 頁面跳轉並傳遞參數
ASP.NET中進行頁面跳轉並傳遞參數主要用到Response對象的Redirect方法,在進行調轉時,如果有參數附加在鏈接中,可以使用"?“來分割頁面地址和參數,如果有多個參數的話,可以用”&"來分割參數。
例如下面兩個ASP頁面WebForm1和WebForm2
// WebForm1.aspx
...
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="姓名"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
<div>
<asp:Label ID="Label2" runat="server" Text="性別"></asp:Label>
<asp:RadioButton ID="RadioButton1" runat="server" OnCheckedChanged="RadioButton1_CheckedChanged" Text="男" GroupName="sex" />
<asp:RadioButton ID="RadioButton2" runat="server" Text="女" GroupName="sex" />
</div>
<div>
<asp:Button ID="Button1" runat="server" Text="登錄" OnClick="Button1_Click" />
</div>
</form>
</body>
...
// WebForm1.aspx.cs
protected void Button1_Click(object sender, EventArgs e){
String name = TextBox1.Text;
String sex = "";
if (RadioButton2.Checked){
sex = "女士";
} else if (RadioButton1.Checked) {
sex = "先生";
}
// WebForm2.aspx?name=name&sex=sex
Response.Redirect("WebForm2.aspx?name=" + name + "&sex=" + sex);
}
// WebForm2.aspx.cs
protected void Page_Load(object sender, EventArgs e){
// String name = Request.Params["name"];
// String sex = Request.Params["sex"];
String name = Request.QueryString["name"];
String sex = Request.QueryString["sex"];
Response.Write("歡迎" + name + sex + "登錄本系統");
}
運行結果如下:
3. Server對象
3.1. Server對象常用屬性和方法
Server對象定義了一個與Web服務器相關的類,提供方法和屬性用於訪問服務器上的資源。
它常用的屬性和方法有:
名稱 | 說明 |
---|---|
MachineName屬性 | 獲取服務器計算機的名稱 |
ScriptTimeout屬性 | 設置請求超時值 |
MapPath方法 | 將虛擬地址轉換爲物理地址 |
UrlEncode方法 | 對Url進行編碼 |
UrlDecode方法 | 對編碼後的Url進行解碼 |
3.2. 獲取服務器的物理地址
獲取服務器的物理地址可以使用MapPath方法,一般寫作
Server.MapPath("WebForm.aspx");
例如下面的代碼:
protected void Page_Load(object sender, EventArgs e){
Response.Write(Server.MapPath("WebForm1.aspx"));
}
運行結果如下所示,可以看到,虛擬地址WebForm1.aspx
被轉換爲了實際的物理地址C:\Users\DELL\source\repos\WebApplication5\WebApplication5\WebForm1.aspx
需要注意的是,MapPath方法不接受相對路徑的寫法,放入MapPath的參數一定要是絕對路徑
3.3. 對字符串進行編碼和解碼
對字符串進行編碼可以使用UrlEncode方法,將要進行編碼的Url傳入URLEncode方法中,就可以得到一個編碼後的Url地址,解碼可以使用URLDecode方法,用法同理。
如下面代碼
protected void Page_Load(object sender, EventArgs e){
Response.Write(Server.UrlEncode("http://WebForm1.aspx") + "</br>");
Response.Write(Server.UrlDecode("http%3a%2f%2fWebForm1.aspx") + "</br>");
}
結果爲:
4. 狀態管理
狀態管理分爲客戶端和服務器端兩種
其中客戶端狀態管理主要是將數據保存到本地的計算機上,當客戶端向服務器端發送請求時,數據隨之發送到服務器,客戶端狀態管理可以使用ViewState對象、HiddenField控件或者Cookie對象來實現。
服務器端狀態管理是將數據保存到服務器上,可以使用Session對象或者Application對象實現
4.1. 客戶端狀態管理
4.1.1. ViewState對象
ViewState又稱爲視圖狀態,它主要用來獲取並保存頁面的狀態信息。在ASP.NET 中,當一個表單被提交時,所有的表單值都會被清空。開啓ViewState可以使得表單提交發生錯誤時,表單中的數據不會丟失,這樣就避免了重複填寫數據。
默認情況下,ViewState的所有服務器控件都是啓用的,但是對於沒有必要維持的頁面和控件,可以靈活禁用ViewState,以降低ViewState對站點性能的影響。
禁用ViewState可以使用EnableViewState屬性,禁用有兩種方法:
- 禁用這個頁面的ViewState
// EnableViewState="false"
<%@ Page EnableViewState="false" Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication5.WebForm2" %>
- 禁用單個控件的ViewState
// EnableViewState="false"
<asp:Button ID="Button1" runat="server" EnableViewState="false" Text="登錄" OnClick="Button1_Click" />
4.1.2. HiddenField控件
HiddenField控件提供了一種在頁面中存儲信息但不顯示信息的方法(隱藏)。例如,可以在HiddenField控件中存儲用戶首選項設置。
若要將信息放入HiddenField控件中,那麼可以在兩次回發之間將HiddenField控件的Value屬性設置爲要存儲的值
4.1.3. Cookie對象
Cookie對象用於保存客戶端瀏覽器請求的服務器頁面,也可以用它存放非敏感性的用戶信息,信息保存的時間可以根據用戶的需要進行設置,Cookie中的數據信息是以文本的形式保存在客戶端計算機中。
它常用的屬性和方法
名稱 | 說明 |
---|---|
Expires屬性 | 設定Cookie變量的有效時間,默認爲1000分鐘,若設爲0則實時刪除 |
Name屬性 | 取得Cookie變量的名稱 |
Value屬性 | 設置Cookie變量的內容值 |
Path屬性 | 設置Cookie適用於的URL |
Equals方法 | 判斷指定的某個Cookie是否等於當前的Cookie |
ToString方法 | 返回Cookie對象的一個字符串表示形式 |
Clear方法 | 清除所有的Cookie |
例如下面的代碼:
// .aspx文件
...
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="姓名"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
</div>
<div>
<asp:Label ID="Label2" runat="server" Text="密碼"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</div>
<div>
<asp:CheckBox ID="CheckBox1" runat="server" Text="記住密碼" />
</div>
<div>
<asp:Button ID="Button1" runat="server" EnableViewState="false" Text="登錄" OnClick="Button1_Click" />
</div>
</form>
</body>
...
// .aspx.cs文件
protected void Button1_Click(object sender, EventArgs e){
if (TextBox1.Text == "1234" && TextBox2.Text == "1234") {
if (CheckBox1.Checked) {
if (Request.Cookies["username"] == null) {
// 設置Cookie過期時間爲30天
Response.Cookies["username"].Expires = DateTime.Now.AddDays(30);
Response.Cookies["password"].Expires = DateTime.Now.AddDays(30);
// 設置Cookie值
Response.Cookies["username"].Value = TextBox1.Text;
Response.Cookies["password"].Value = TextBox2.Text;
}
}
}
}
protected void TextBox1_TextChanged(object sender, EventArgs e){
// 判斷Cookie中的用戶名是否與用戶輸入的用戶名一致,一致則自動顯示用戶密碼
if (Request.Cookies["username"] != null) {
if (Request.Cookies["username"].Value.Equals(TextBox1.Text)) {
TextBox2.Text = Request.Cookies["password"].Value;
}
}
}
效果如下所示,輸入用戶名1234,按回車鍵,瀏覽器會自動填充密碼
4.2. 服務器端狀態管理
4.2.1. Session對象
Session對象用來存儲跨頁面的變量或者對象,它中止於瀏覽器關閉或者超過設定的Session變量有效時間時,Session對象纔會消失。
它常用的屬性和方法
名稱 | 說明 |
---|---|
Contents集合 | 用於確定Session對象的值的集合 |
StaticObjects集合 | 確定某對象指定屬性的值集合,並檢索所有靜態對象的所有屬性 |
TimeOut屬性 | 設定Session對象變量的有效時間,當使用者超過有效時間沒有動作Session對象就會失效。默認值爲20分鐘 |
Abandon方法 | 此方法結束當前會話,並清除會話中的所有信息 |
Clear方法 | 此方法清除全部的Session對象變量,但不結束會話 |
例如下面的代碼:
// WebForm1.aspx文件
...
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="姓名"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
<div>
<asp:Label ID="Label2" runat="server" Text="密碼"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</div>
<div>
<asp:CheckBox ID="CheckBox1" runat="server" Text="記住密碼" />
</div>
<div>
<asp:Button ID="Button1" runat="server" EnableViewState="false" Text="登錄" OnClick="Button1_Click" />
</div>
</form>
</body>
...
// WebForm1.aspx.cs文件
protected void Button1_Click(object sender, EventArgs e){
if (TextBox1.Text == "1234" && TextBox2.Text == "1234") {
Session["username"] = TextBox1.Text;
Session["time"] = DateTime.Now;
Response.Redirect("WebForm2.aspx");
}
}
// WebForm2.aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
Response.Write("歡迎" + Session["username"] + "來到本系統</br>");
Response.Write("您的登錄時間爲:" + Session["time"]);
}
效果如圖所示,點擊登錄按鈕之後,會跳轉到第二個頁面,並顯示存入Session的信息:
4.2.2. Application對象
Application對象用於共享應用程序級的信息,即多個用戶共享一個Application對象。Application對象是用於啓動和管理ASP.NET應用程序的主要對象。
實際使用時,在第一個用戶第一次請求.aspx頁面時,就會啓動ASP.NET應用程序並且創建Application對象,在應用程序沒有結束之前,Application對象會一直存在
它的主要屬性和方法有:
名稱 | 說明 |
---|---|
Contents集合 | 用於確定Session對象的值的集合 |
StaticObjects集合 | 確定某對象指定屬性的值集合,並檢索所有靜態對象的所有屬性 |
AllKeys屬性 | 返回全部Application對象變量名到一個字符串數組中 |
Count屬性 | 獲取Application對象變量的數量 |
Item屬性 | 允許使用索引或Application變量名稱傳回內容值 |
Add方法 | 新增一個Application對象變量 |
Set方法 | 使用變量名稱修改一個Application對象變量的內容 |
Clear方法 | 清除全部Application對象變量的內容 |
Lock方法 | 鎖定全部Application對象變量 |
Unlock方法 | 解除鎖定的Application對象變量 |
Remove方法 | 使用變量名稱移除一個Application對象變量 |
RemoveAll方法 | 移除全部Application對象變量 |
例如下面的代碼,通過Application對象來統計網站的訪問量
// .aspx文件
...
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"></asp:Label>
</div>
</form>
</body>
...
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
Label1.Text = "網站已被訪問" + Application["count"] + "次";
}
// Global.asax.cs文件
protected void Application_Start(object sender, EventArgs e){
// 創建一個count用來計算訪問量,初始化爲0
Application["count"] = 0;
}
protected void Session_Start(object sender, EventArgs e){
// 訪問網站時,訪問量+1
Application.Lock();
Application["count"] = (int)Application["count"] + 1;
Application.UnLock();
}
運行效果如下,第一次打開時顯示上圖,複製地址到另一個瀏覽器頁面打開,顯示下圖: