第 13 章 ASP.NET 内置对象,应用程序配置和缓存
Web 应用程序在传统的意义上来说是无状态的,Web 应用不能像 Win Form 那样维持客户端状态,
所以在 Web 应用中,通常需要使用内置对象进行客户端状态的保存。这些内置对象能够为 Web 应用程
序的开发提供设置,配置以及检索等功能。
13.1 ASP.NET 内置对象
在 ASP 的开发中,这些内置对象已经存在,这些内置对象包括 Response、Request、Application 等,
虽然 ASP 是一个可以称得上是“过时的”技术,但是在 ASP.NET 开发人员中依旧可以使用这些对象。
这些对象不仅能够获取页面传递的参数,某些对象还可以保存用户的信息,如 Cookie、Session 等。
13.1.1 Request 传递请求对象
Request 对象是 HttpRequest 类的一个实例,Request 对象用于读取客户端在 Web 请求期间发送的
HTTP 值。Request 对象常用的属性如下所示。
QueryString:获取 HTTP 查询字符串变量的集合。
Path:获取当前请求的虚拟路径。
UserHostAddress:获取远程客户端 IP 主机的地址。
Browser:获取有关正在请求的客户端的浏览器功能的信息。
1.QueryString:请求参数
QueryString 属性是用来获取 HTTP 查询字符串变量的集合,通过 QueryString 属性能够获取页面传
递的参数。在超链接中,往往需要从一个页面跳转到另外一个页面,跳转的页面需要获取 HTTP 的值来
进行相应的操作,例如新闻页面的 news.aspx?id=1。为了获取传递过来的 id 的值,则可以使用 Request
的 QueryString 属性,示例代码如下所示。
protected void Page_Load(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(Request.QueryString["id"]))
{
Label1.Text = Request.QueryString["id"];
//如果传递的 ID 值不为空
//将传递的值赋予标签中
}
else
{
Label1.Text = "没有传递的值";
//提示没有传递的值
}
if (!String.IsNullOrEmpty(Request.QueryString["type"]))
{
Label2.Text = Request.QueryString["type"];
//如果传递的 TYPE 值不为空
//获取传递的 TYPE 值
}
else
Label2.Text = "没有传递的值";
//无值时进行相应的编码
{
}
}
上述代 码使用 Request 的 QueryString 属性来 接受传递 的 HTTP 的值, 当通过访 问页面路 径为
“http://localhost:29867/Default.aspx”时,默认传递的参数为空,因为其路径中没有对参数的访问。而当
访问的页面路径为“http://localhost:29867/Default.aspx?id=1&type=QueryString&action=get”时,就可以
从路径中看出该地址传递了三个参数,这三个参数和值分别为 id=1、type=QueryString 以及 action=get。
2.Path:获取路径
通过使用 Path 的方法可以获取当前请求的虚拟路径,示例代码如下所示。
Label3.Text = Request.Path.ToString();
//获取请求路径
当在应用程序开发中使用 Request.Path.ToString()时,就能够获取当前正在被请求的文件的虚拟路径
的值,当需要对相应的文件进行操作时,可以使用 Request.Path 的信息进行判断。
3.UserHostAddress:获取 IP 记录
通过使用 UserHostAddress 的方法,可以获取远程客户端 IP 主机的地址,示例代码如下所示。
Label4.Text = Request.UserHostAddress;
//获取客户端 IP
在客户端主机 IP 统计和判断中,可以使用 Request.UserHostAddress 进行 IP 统计和判断。在有些系
统中,需要对来访的 IP 进行筛选,使用 Request.UserHostAddress 就能够轻松的判断用户 IP 并进行筛选
操作。
4.Browser:获取浏览器信息
通过使用 Browser 的方法,可以判断正在浏览网站的客户端的浏览器的版本,以及浏览器的一些信
息,示例代码如下所示。
Label5.Text = Request.Browser.Type.ToString();
//获取浏览器信息
这些属性能够获取服务器和客户端的相应信息,也可以通过“?”号进行 HTTP 的值的传递和获取,
上述代码运行结果如图 13-1 所示。
图 13-1 Request 对象
Request 不仅包括这些常用的属性,还包括其他属性,例如用于获取当前目录在服务器虚拟主机中
的绝对路径(如 ApplicationPath)。另外,开发人员也可是使用 Request 中的 Form 属性进行页面中窗体
的值集合的获取。
343
13.1.2 Response 请求响应对象
Response 对象是 HttpResponse 类的一个实例。HttpResponse 类用户封装页面操作的 HTTP 响应信息。
Response 对象的常用属性如下所示。
BufferOutput:获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个页面之后将其发
送。
Cache:获取 Web 页面的缓存策略。
Charset:获取或设置输出流的 HTTP 字符集类型。
IsClientConnected:获取一个值,通过该值指示客户端是否仍连接在服务器上。
ContentEncoding:获取或设置输出流的 HTTP 字符集。
TrySkipIisCustomErrors:获取或设置一个值,指定是否支持 IIS 7.0 自定义错误输出。
1.Response 常用属性
BufferOutput 的默认属性为 True。当页面被加载时,要输出到客户端的数据都暂时存储在服务器的
缓冲期内并等待页面所有事件程序,以及所有的页面对象全部被浏览器解释完毕后,才将所有在缓冲区
中的数据发送到客户端浏览器,示例代码如下所示。
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("缓冲区清除前..");
}
//输出缓冲区清除
上述代码在 cs 文件中重写了 Page_Load 事件,该事件用于中向浏览器输出一行字符串“缓冲区清
除前”。在 ASPX 页面中,可以为页面增加代码以判断缓冲区的执行时间,示例代码如下所示。
//输出字符串
上述代码在页面中插入了一段代码,并输出字符串“缓冲区被清除”。在运行该页面时,数据已经
存放在缓冲区中。然后 IIS 才开始读取 HTML 组件的部分,读取完毕后才将结果送至客户端浏览器,所
以在运行结果中可以发现,“缓冲期清除前”是在“缓冲区被清除”字符串之前出现,如图 13-2 所示。
因为 BufferOutput 属性默认为 true,所以上述代码并无法看到明显的区别,当在浏览器输出前清除
344
图 13-2 BufferOutput
缓冲区时,则可以看出区别。示例代码如下所示。
Response.Write("缓冲区清除前..");
Response.Clear();
//清除缓冲区
当使用 Response 的 Clear 方法时,缓冲区就被显式的清除了。在运行后,“缓冲区清除前”字符串
被清除,并不会呈现给浏览器。当需要屏蔽 Clear 方法对缓冲区的数据清除,则可以指定 BufferOutput
的属性为 False,示例代码如下所示。
Response.BufferOutput = false;
Response.Write("缓冲区清除前..");
Response.Clear();
//设置缓冲区属性
//设置清除前字符
//清除缓冲区
使用上述代码将指定 BufferOutput 的属性为 False,在运行时缓冲区数据不会被 Clear 方法清除。
2.Response 常用方法
Response 方法可以输出 HTML 流到客户端,其中包括发送信息到客户端和客户端 URL 重定向,不
仅如此,Response 还可以设置 Cookie 的值以保存客户端信息。Response 的常用方法如下所示:
Write:向客户端发送指定的 HTTP 流。
End:停止页面的执行并输出相应的结果。
Clear:清除页面缓冲区中的数据。
Flush:将页面缓冲区中的数据立即显示。
Redirect:客户端浏览器的 URL 地址重定向。
在 Response 的常用方法中,Write 方法是最常用的方法,Write 能够向客户端发送指定的 HTTP 流,
并呈现给客户端浏览器,示例代码如下所示。
Response.Write("
这是一串HTML流
");
上述代码则会向浏览器输出一串 HTML 流并被浏览器解析,如图 13-3 所示。
当希望在 Response 对象运行时,能够中途进行停止时,则可以使用 End 方法对页面的执行过程进
图 13-3 Response.Write 方法
行停止,示例代码如下所示。
for (int i=0; i < 100; i++)
{
if (i < 10)
{
Response.Write("当前输出了第" + i + "行
");
//循环 100 次
//判断 i<10
//i<10 则输出 i
//否则停止输出
}
else
{
}
}
Response.End();
//使用了 End 方法停止执行
上述代码循环输出 HTML 流“当前输出了第 X 行”,当输出到 10 行时,则停止输出,如图 13-4
所示。
345
图 13-4 Response.End 方法
Redirect 方法通常使用于页面跳转,示例代码如下所示。
Response.Redirect("http://www.shangducms.com");
执行上述代码,将会跳转到相应的 URL。
//页面跳转
13.1.3 Application 状态对象
Application 对象是 HttpApplication 类的实例,将在客户端第一期从某个特定的 ASP.NET 应用程序
虚拟目录中请求任何 URL 资源时创建。对于 Web 应用上的每个 ASP.NET 应用程序都要创建一个单独
的实例。然后通过内部 Application 对象公开对每个实例进行引用。
1.Application 对象的特性
对于 Application 对象有如下特性:
数据可以在 Application 对象之内进行数据共享,一个 Application 对象可以覆盖多个用户。
Application 对象可以用 Internet Service Manager 来设置而获得不同的属性。
单独的 Application 对象可以隔离出来并运行在内存之中。
可以停止一个 Application 对象而不会影响到其他 Application 对象。
Application 对象常用的属性有:
AllKey:获取 HttpApplicationState 集合中的访问键。
Count:获取 HttpApplicationState 集合中的对象数。
其中 Application 对象的常用方法有:
Add:新增一个 Application 对象变量。
Clear:清除全部的 Application 对象变量。
Get:通过索引关键字或变量名称得到变量的值。
GetKey:通过索引关键字获取变量名称。
346
Lock:锁定全部的 Application 对象变量。
UnLock:解锁全部的 Application 对象变量。
Remove:使用变量名称移除一个 Application 对象变量。
RemoveAll:移除所有的 Application 对象变量。
Set:使用变量名更新一个 Application 对象变量。
2.Application 对象的使用
通过使用 Application 对象的方法,能够对 Application 对象进行操作,使用 Add 方法能够创建
Application 对象,示例代码如下所示。
Application.Add("App", "MyValue");
Application.Add("App1", "MyValue1");
Application.Add("App2", "MyValue2");
//增加 Application 对象
//增加 Application 对象
//增加 Application 对象
若需要使用 Application 对象,可以通过索引 Application 对象的变量名进行访问,示例代码如下所
示:
Response.Write(Application["App1"].ToString());
//输出 Application 对象
上述代码直接通过使用变量名来获取 Application 对象的值。通过 Application 对象的 Get 方法也能
够获取 Application 对象的值,示例代码如下所示。
for (int i = 0; i < Application.Count; i++)
{
Response.Write(Application.Get(i).ToString());
}
//遍历 Application 对象
//输出 Application 对象
Application 对象通常可以用来统计在线人数,在页面加载后可以通过配置文件使用 Application 对象
的 Add 方法进行 Application 对象的创建,当用户离开页面时,可以使用 Application 对象的 Remove 方
法进行 Application 对象的移除。当 Web 应用不希望用户在客户端修改已经存在的 Application 对象时,
可以使用 Lock 对象进行锁定,当执行完毕相应的代码块后,可以解锁。示例代码如下所示。
Application.Lock();
Application["App"] = "MyValue3";
Application.UnLock();
//锁定 Application 对象
//Application 对象赋值
//解锁 Application 对象
上述代码当用户进行页面访问时,其客户端的 Application 对象被锁定,所以用户的客户端不能够进
行 Application 对象的更改。在锁定后,也可以使用 UnLock 方法进行解锁操作。
13.1.4 Session 状态对象
Session 对象是 HttpSessionState 的一个实例,Session 是用来存储跨页程序的变量或对象,功能基本
同 Application 对象一样。但是 Session 对象的特性与 Application 对象不同。Session 对象变量只针对单一
网页的使用者,这也就是说各个机器之间的 Session 的对象不尽相同。
例如用户 A 和用户 B,当用户 A 访问该 Web 应用时,应用程序可以显式的为该用户增加一个 Session
值,同时用户 B 访问该 Web 应用时,应用程序同样可以为用户 B 增加一个 Session 值。但是与 Application
不同的是,用户 A 无法存取用户 B 的 Session 值,用户 B 也无法存取用户 A 的 Session 值。Application
对象终止于 IIS 服务停止,但是 Session 对象变量终止于联机机器离线时,也就是说当网页使用者关闭浏
览器或者网页使用者在页面进行的操作时间超过系统规定时,Session 对象将会自动注销。
1.Session 对象的特性
Session 对象常用的属性有:
347
IsNewSession:如果用户访问页面时是创建新会话,则此属性将返回 true,否则将返回 false。
TimeOut:传回或设置 Session 对象变量的有效时间,如果在有效时间内有没有任何客户端动作,
则会自动注销。
注意:如果不设置 TimeOut 属性,则系统默认的超时时间为 20 分钟。
Session 对象常用的方法有:
Add:创建一个 Session 对象。
Abandon:该方法用来结束当前会话并清除对话中的所有信息,如果用户重新访问页面,则可
以创建新会话。
Clear:此方法将清除全部的 Session 对象变量,但不结束会话。
注意:Session 对象可以不需要 Add 方法进行创建,直接使用 Session[“变量名”]=变量值的语法也可
以进行 Session 对象的创建。
2.Session 对象的使用
Session 对象可以使用于安全性相比之下较高的场合,例如后台登录。在后台登录的制作过程中,管
理员拥有一定的操作时间,而如果管理员在这段时间不进行任何操作的话,为了保证安全性,后台将自
动注销,如果管理员需要再次进行操作,则需要再次登录。在管理员登录时,如果登录成功,则需要给
管理员一个 Session 对象,示例代码如下所示。
protected void Button1_Click(object sender, EventArgs e)
{
Session["admin"] = "guojing";
Response.Redirect("Session.aspx");
}
//新增 Session 对象
//页面跳转
当管理员单击注销按钮时,则会注销 Session 对象并提示再次登录,示例代码如下所示。
protected void Button2_Click(object sender, EventArgs e)
{
Session.Clear();
Response.Redirect("Session.aspx");
}
//删除所有 Session 对象
在 Page_Load 方法中,可以判断是否已经存在 Session 对象,如果存在 Session 对象,则说明管理员
当前的权限是正常的,而如果不存在 Session 对象,则说明当前管理员的权限可能是错误的,或者是非
法用户正在访问该页面,示例代码如下所示。
protected void Page_Load(object sender, EventArgs e)
{
if (Session["admin"] != null)
{
if (String.IsNullOrEmpty(Session["admin"].ToString()))
{
Button1.Visible = true;
Button2.Visible = false;
//Response.Redirect("admin_login.aspx");
}
else
{
}
Button1.Visible = false;
Button2.Visible = true;
//如果 Session[“admin”]不为空
//则判断是否为空字符串
//显式登录控件
//隐藏注销控件
//跳转到登录页面
//显式注销控件
//隐藏注销控件
348
}
}
上述代码当管理员没有登录时,则会出现登录按钮,如果登录了,存在 Session 对象,则登录按钮
被隐藏,只显示注销按钮。其 HTML 代码如下所示。
上述代码运行后如图 13-5 和图 13-6 所示。
当再次单击【注销】按钮时则会清空 Session 对象,再次返回登录窗口时会呈现同图 13-5 所示。
图 13-5 登录前
图 13-6 登录后
13.1.5 Server 服务对象
Server 对象是 HttpServerUtility 的一个实例,该对象提供对服务器上的方法和属性进行访问。
1.Server 对象的常用属性
Server 对象的常用属性如下所示。
MachineName:获取远程服务器的名称。
ScriptTimeout:获取和设置请求超时。
通过 Server 对象能够获取远程服务器的信息,示例代码如下所示。
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Server.MachineName);
}
//输出服务器信息
上述代码运行后将会输出服务器名称,本例输出为“WIN-YXDGNGPG621”,这个输出结果根据
服务器的名称不同而不同。
2.Server 对象的常用方法
Server 对象的常用方法如下所示。
CreatObject:创建 COM 对象的一个服务器实例。
Execute:使用另一个页面执行当前请求。
Transfer:终止当前页面的执行,并为当前请求开始执行新页面。
HtmlDecode:对已被编码的消除 Html 无效字符的字符串进行解码。
HtmlEncode:对要在浏览器中显示的字符串进行编码。
MapPath:返回与 Web 服务器上的执行虚拟路径相对应的物理文件路径。
UrlDecode:对字符串进行解码,该字符串为了进行 HTTP 传输而进行编码并在 URL 中发送到
服务器。
UrlEncode:编码字符串,以便通过 URL 从 Web 服务器到客户端浏览器的字符串传输。
349