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();
}

运行效果如下,第一次打开时显示上图,复制地址到另一个浏览器页面打开,显示下图:
在这里插入图片描述

发布了221 篇原创文章 · 获赞 1037 · 访问量 138万+

猜你喜欢

转载自blog.csdn.net/baishuiniyaonulia/article/details/105211817