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("客户端的信息:");
Response.Write("发出请求的主机名称:" + Request.UserHostName + "");
Response.Write("发出请求的主机IP:" + Request.UserHostAddress + "");
Response.Write("发出请求的主机的User-Agent:" + Request.UserAgent + "");
Response.Write("请求访问的地址:" + Request.Url + "");
}
结果如图所示,由于是本地访问,因此主机名称和IP显示为::1
:
在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的值
在ASP.NET中,可以使用Browser属性来获取客户端浏览器相关信息,该属性返回一个HttpBrowserCapabilities对象,这个对象记录了浏览器相关的信息
例如下面的代码,通过HttpBrowserCapabilities 读取浏览器的信息:
protected void Page_Load(object sender, EventArgs e){
HttpBrowserCapabilities hbc = Request.Browser;
Response.Write("客户端浏览器的信息:");
Response.Write("浏览器类型:" + hbc.Type + "");
Response.Write("浏览器名称:" + hbc.Browser + "");
Response.Write("浏览器版本:" + hbc.Version + "");
Response.Write("浏览器支持的主版本号" + hbc.MajorVersion + "
");
Response.Write("浏览器支持的兼容版本号" + hbc.MinorVersion + "
");
Response.Write("浏览器是否为Beta测试版本:" + hbc.Beta + "
");
Response.Write("浏览器是否为爬虫程序:" + hbc.Crawler + "
");
Response.Write("浏览器是否为AOL浏览器:" + hbc.AOL + "
");
Response.Write("浏览器是否运行在Win16计算机上:" + hbc.Win16 + "
");
Response.Write("浏览器是否运行在Win32计算机上:" + hbc.Win32 + "
");
Response.Write("浏览器操作平台:" + hbc.Platform + "");
Response.Write("浏览器是否支持框架:" + hbc.Frames + "");
Response.Write("浏览器是否支持表格:" + hbc.Tables + "");
Response.Write("浏览器是否支持Cookie:" + hbc.Cookies + "");
Response.Write("浏览器是否支持VB:" + hbc.VBScript + "
");
Response.Write("浏览器是否支持JavaScript:" + hbc.JavaScript + "
");
Response.Write("浏览器是否支持Applets:" + hbc.JavaApplets + "
");
Response.Write("浏览器是否支持ActiveX:" + hbc.ActiveXControls + "
");
Response.Write("浏览器是否支持用于网络广播频道定义格式(CDF):" + hbc.CDF + "
");
}
Response对象用于将数据从服务器发送回浏览器,它允许将数据作为请求的结果发送到浏览器中,并提供有关响应的信息,另外,它还可以用来在页面中输入数据、跳转或者传递页面中的参数。
部分常用的Response类的属性和方法
名称 | 说明 |
---|---|
Write方法 | 将数据输出到客户端 |
WriteFile方法 | 将指定的文件写入HTTP内容输出流 |
Redirect方法 | 用于ASP.NET页面的跳转 |
完整的Response属性和方法种类繁多,可以在这个页面详细查看:.NET HttpResponse类
使用Write方法和WriteFile方法可以在.asp页面中输出数据,可以输出的数据包括:字符、字符串、字符数组、对象和文件
例如下面的代码:
protected void Page_Load(object sender, EventArgs e){
// 输出字符
char ch = 'a';
Response.Write("输出单个字符:" + ch + "");
// 输出字符串
String str = "abcd";
Response.Write("输出字符串:" + str + "");
// 输出字符数组的类型和内容
char[] chArray = {
'a', 'c', 'e', 'g', 'i' };
Response.Write("输出字符数组:" + chArray + "");
Response.Write(chArray, 0, chArray.Length);
Response.Write("");
// 输出对象类型
Page page = new Page();
Response.Write("输出一个对象:" + page + "");
// 输出文件路径和内容
Response.Write("输出文件:" + Server.MapPath("TextFile1.txt") + "");
Response.WriteFile(Server.MapPath("TextFile1.txt"));
}
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 + "登录本系统");
}
Server对象定义了一个与Web服务器相关的类,提供方法和属性用于访问服务器上的资源。
它常用的属性和方法有:
名称 | 说明 |
---|---|
MachineName属性 | 获取服务器计算机的名称 |
ScriptTimeout属性 | 设置请求超时值 |
MapPath方法 | 将虚拟地址转换为物理地址 |
UrlEncode方法 | 对Url进行编码 |
UrlDecode方法 | 对编码后的Url进行解码 |
获取服务器的物理地址可以使用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的参数一定要是绝对路径
对字符串进行编码可以使用UrlEncode方法,将要进行编码的Url传入URLEncode方法中,就可以得到一个编码后的Url地址,解码可以使用URLDecode方法,用法同理。
如下面代码
protected void Page_Load(object sender, EventArgs e){
Response.Write(Server.UrlEncode("http://WebForm1.aspx") + "");
Response.Write(Server.UrlDecode("http%3a%2f%2fWebForm1.aspx") + "");
}
状态管理分为客户端和服务器端两种
其中客户端状态管理主要是将数据保存到本地的计算机上,当客户端向服务器端发送请求时,数据随之发送到服务器,客户端状态管理可以使用ViewState对象、HiddenField控件或者Cookie对象来实现。
服务器端状态管理是将数据保存到服务器上,可以使用Session对象或者Application对象实现
ViewState又称为视图状态,它主要用来获取并保存页面的状态信息。在ASP.NET 中,当一个表单被提交时,所有的表单值都会被清空。开启ViewState可以使得表单提交发生错误时,表单中的数据不会丢失,这样就避免了重复填写数据。
默认情况下,ViewState的所有服务器控件都是启用的,但是对于没有必要维持的页面和控件,可以灵活禁用ViewState,以降低ViewState对站点性能的影响。
禁用ViewState可以使用EnableViewState属性,禁用有两种方法:
// EnableViewState="false"
<%@ Page EnableViewState="false" Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication5.WebForm2" %>
// EnableViewState="false"
<asp:Button ID="Button1" runat="server" EnableViewState="false" Text="登录" OnClick="Button1_Click" />
HiddenField控件提供了一种在页面中存储信息但不显示信息的方法(隐藏)。例如,可以在HiddenField控件中存储用户首选项设置。
若要将信息放入HiddenField控件中,那么可以在两次回发之间将HiddenField控件的Value属性设置为要存储的值
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,按回车键,浏览器会自动填充密码
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"] + "来到本系统");
Response.Write("您的登录时间为:" + Session["time"]);
}
效果如图所示,点击登录按钮之后,会跳转到第二个页面,并显示存入Session的信息:
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();
}