1. HTTP请求 Request对象
1.1. Request对象常用属性和方法
Request对象是HttpRequest类的一个实例, 它提供对当前页请求的访问,其中包括User-Agent、Address、Cookie、客户端证书、查询字符串等信息,用户可以使用该类来读取浏览器发送到服务器的内容。
部分常用的Request类的属性和方法
完整的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类的属性和方法
完整的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服务器相关的类,提供方法和属性用于访问服务器上的资源。
它常用的属性和方法有:
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中的数据信息是以文本的形式保存在客户端计算机中。
它常用的属性和方法
例如下面的代码:
// .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对象才会消失。
它常用的属性和方法
例如下面的代码:
// 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对象会一直存在
它的主要属性和方法有:
例如下面的代码,通过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(); }
运行效果如下,第一次打开时显示上图,复制地址到另一个浏览器页面打开,显示下图: