ASP.NET中HTTP請求(Request)、響應(Response)以及狀態管理講解

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屬性,禁用有兩種方法:

  1. 禁用這個頁面的ViewState
// EnableViewState="false"
<%@ Page EnableViewState="false" Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication5.WebForm2" %>
  1. 禁用單個控件的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();
}

運行效果如下,第一次打開時顯示上圖,複製地址到另一個瀏覽器頁面打開,顯示下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章