《ASP.NETWeb应用系统开发教学课件作者于华15第4章节》由会员分享,可在线阅读,更多相关《ASP.NETWeb应用系统开发教学课件作者于华15第4章节(70页珍藏版)》请在金锄头文库上搜索。
1、第4章 ASP.NET的内置对象,4.1 概述 4.2 Application对象 4.3 Session对象 4.4 ViewState对象 4.5 Request和Response对象 4.6 Server对象 4.7 Cookie对象 4.8 实战演练统计在线人数,4.1 概 述 每次将网页发送到服务器时,都会创建网页类的一个新实例。在传统的 Web 编程中,这通常意味着在每一次往返行程中,与该页及该页上的控件相关联的所有信息都会丢失。例如,若用户将信息输入到文本框,则该信息将在从浏览器或客户端设备到服务器的往返行程中丢失。,为了解决传统的 Web 编程的固有限制,ASP.NET提供了包
2、括视图状态、控件状态、隐藏域、Cookie、查询字符串、应用程序状态、会话状态、配置文件属性等若干选项,可帮助用户按页保留数据或在整个应用程序范围内保留数据。 视图状态、控件状态、隐藏域、Cookie和查询字符串均会以不同方式将数据存储到客户端上,而应用程序状态、会话状态和配置文件属性都将数据存储到服务器上的内存中。每个选项都有不同的优点和缺点,具体取决于相应的方案。,4.1.1 基于客户端的状态管理选项 下面介绍一些状态管理选项,这些选项涉及在页中或客户端计算机上存储信息。对于这些选项,在各页面往返行程间不会在服务器上维护任何信息。 1视图状态 ViewState 属性提供一个字典对象,用于
3、在对同一页的多个请求之间保留值。这是页用来在往返行程之间保留页和控件属性值的默认方法。,在处理页时,页和控件的当前状态会散列为一个字符串,并在页中保存为一个隐藏域或多个隐藏域(如果存储在 ViewState 属性中的数据量超过了 MaxPageStateFieldLength 属性中的指定值)。当将页回发到服务器时,页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。,2控件状态 有时,为了让控件正常工作,开发人员需要按顺序存储控件状态数据。例如,编写一个自定义控件,其中使用了不同的选项卡来显示不同的信息。为了让自定义控件按预期的方式工作,该控件需要知道在往返行程之间选择了哪个选项卡,
4、可以使用ViewState 属性来实现这一目的。不过,开发人员可以在页级别关闭视图状态,但这会使控件无法正常工作。为了解决此问题,ASP.NET 页框架在 ASP.NET 中公开了一项名为控件状态的功能。 ControlState属性允许开发人员保持特定于某个控件的属性信息,且不像ViewState 属性那样被关闭。,3隐藏域 ASP.NET允许开发人员将信息存储在 HiddenField 控件中,此控件将呈现为一个标准的 HTML 隐藏域。隐藏域在浏览器中不以可见的形式呈现,但开发人员可以像对待标准控件一样设置其属性。当向服务器提交页时,隐藏域的内容将在 HTTP 窗体集合中随同其他控件的值
5、一起发送。隐藏域可用做一个储存库,开发人员可以将希望直接存储在页中的任何特定于页的信息放置到其中。,恶意用户可以很容易地查看和修改隐藏域的内容,所以开发人员不应在隐藏域中存储任何敏感或保障应用程序正确运行的信息。 HiddenField控件在Value 属性中只存储一个变量,并且必须通过显式方式添加到页上。 为了在页处理期间能够使用隐藏域的值,必须使用 HTTP POST 命令提交相应的页。如果在使用隐藏域的同时,为了响应某个链接或 HTTP GET 命令而对页进行了相应处理,那么隐藏域将不可用。,4Cookie Cookie是一些少量的数据,这些数据或者存储在客户端文件系统的文本文件中,或者
6、存储在客户端浏览器会话的内存中。Cookie 包含特定于站点的信息,这些信息是随页输出一起由服务器发送到客户端的。Cookie 可以是临时的(具有特定的过期时间和日期),也可以是永久的。 可以使用Cookie来存储有关特定客户端、会话或应用程序的信息。Cookie 保存在客户端设备上,当浏览器请求某页时,客户端会将Cookie中的信息连同请求信息一起发送。服务器可以读取Cookie并提取它的值。Cookie常用于存储标记(可能已加密),以指示该用户已经在应用程序中进行了身份验证。,浏览器只能将数据发送回最初创建该Cookie的服务器。但是,恶意用户可通过多种方法访问Cookie并读取其中的内容
7、。建议开发人员不要将敏感信息(如用户名或密码)存储在 Cookie 中。可以在Cookie中存储一个标识用户的标记,然后使用该标记在服务器上查找敏感信息。 5查询字符串 查询字符串是在页 URL 的结尾附加的信息。下面是一个典型的查询字符串示例: http:/ 查询字符串提供了一种维护状态信息的方法,这种方法很简单,但有使用上的限制。利用查询字符串可以很容易地将信息从一页传送到另一页。例如,将产品号从一页传送到将处理该产品号的另一页。但是,大多数浏览器和客户端设备会将URL的最大长度限制为2083个字符。,在查询字符串中传递的信息可能会被恶意用户篡改,所以不要通过查询字符串来传递重要的或敏感的
8、数据。此外,用户可以创建 URL 的书签或将 URL 发送给其他用户,从而将这些信息与 URL 一起传递。 若要在页处理期间可以使用查询字符串的值,必须使用HTTP GET命令提交页。也就是说,如果为了响应HTTP POST命令而对页进行了相应处理,则不能利用查询字符串。 表4.1列出了ASP.NET可用的客户端状态管理选项,并提供了有关何时使用每个选项的建议。,表4.1 客户端状态管理选项及使用建议,4.1.2 基于服务器的状态管理选项 ASP.NET提供了多种方法,用于维护服务器上的状态信息。通过基于服务器的状态管理,可以保留状态。用户可以减少发送给客户端的信息量,但它可能会使用服务器上高
9、成本的资源。有三种基于服务器的状态管理功能:应用程序状态、会话状态及配置文件属性。有关配置文件属性的内容可参见1.4.3节,下面简要介绍前两种服务器的状态管理功能。,1应用程序状态 ASP.NET允许用户使用应用程序状态来保存每个活动的 Web 应用程序的值,应用程序状态是 HttpApplicationState 类的一个实例。应用程序状态是一种全局存储机制,可从 Web 应用程序中的所有页面访问。因此,应用程序状态可用于存储需要在服务器往返行程之间及页请求之间维护的信息。 应用程序状态存储在一个键/值字典中,在每次请求一个特定的 URL 期间就会创建这样一个字典。可以将特定于应用程序的信息
10、添加到此结构以在页请求期间存储它。一旦将应用程序特定的信息添加到应用程序状态中,服务器就会管理该对象。,2会话状态 ASP.NET允许用户使用会话状态来保存每个活动的Web会话的值,会话状态是 HttpSessionState 类的一个实例。 会话状态与应用程序状态相似,不同的只是会话状态的范围限于当前的浏览器会话。如果有不同的用户在使用同一应用程序,则每个用户会话都将有一个不同的会话状态。此外,如果同一用户在退出后又返回到应用程序,第二个用户会话的会话状态也会与第一个不同。,会话状态采用键/值字典形式的结构来存储特定于会话的信息,这些信息需要在服务器往返行程之间及页请求之间进行维护。 可以使
11、用会话状态来完成以下任务: 唯一标识浏览器或客户端设备请求,并将这些请求映射到服务器上的单独会话实例。 在服务器上存储特定于会话的数据,以用于同一会话内的多个浏览器或客户端设备请求。, 引发适当的会话管理事件,可以利用这些事件编写应用程序代码。 一旦将应用程序特定的信息添加到会话状态中,服务器就会管理该对象。根据用户指定选项的不同,可以将会话信息存储在 Cookie 中、进程服务器中或运行 Microsoft SQL Server 的计算机中。 表4.2列出了ASP.NET可用的服务器状态管理选项,并提供了有关何时使用何种选项的建议。,表4.2 服务器状态管理选项及使用建议,4.2 Appli
12、cation对象 4.2.1 使用Application对象存储数据 ASP.NET通过HttpApplicationState类将应用程序状态提供为一种存储全局应用程序特定信息(对于整个应用程序都可见)的方法。应用程序状态变量实际上是 ASP.NET 应用程序的全局变量。 用户可以在应用程序状态中存储应用程序特定的值,应用程序状态由服务器来管理。由多个会话共享并且不经常更改的数据是插入到应用程序状态变量的理想数据。,由于Application对象被整个应用程序的所有用户共享,因此在使用Application对象存储和读取数据时,为了保证数据的一致性,必须对Application对象进行加锁,
13、即在同一个时刻,只能有一个用户修改Application对象中的数据。Application对象存储数据的方法比较简单,即使用“键/值”对的方式保存数据。 可以通过代码直接对Contents集合中的值进行添加、访问或移除操作。在应用程序运行时,可以随时访问HttpApplicationState类,但该类通常用于在应用程序启动时加载应用程序状态数据。为此,可向Global.asax文件的Application_Start方法中添加加载应用程序状态的代码。,4.2.2 Application对象常用属性和方法 Application对象常用属性及说明如表4.3所示。 Application对象常
14、用方法及说明如表4.4所示。,表4.3 Application对象常用属性及说明,表4.4 Application对象常用方法及说明,4.2.3 使用应用程序状态的优缺点 应用程序状态的精心设计和实现可以提高Web应用程序的性能。例如,将常用的、相关的静态数据集放置到应用程序状态中,则可以通过减少对数据库的数据请求总数来提高站点性能。但是,这里存在一种性能平衡问题。当服务器负载增加时,包含大块信息的应用程序状态变量会降低Web服务器的性能。在移除或替换值之前,不释放在应用程序状态中存储的变量所占用的内存。因此,最好只将应用程序状态变量用于更改不频繁的小型数据集。,1使用应用程序状态的优点 (1
15、) 实现简单:应用程序状态易于使用,为ASP开发人员所熟悉,并且与其他.NET Framework类一致。 (2) 应用程序范围:由于应用程序状态可供应用程序中的所有页访问,因此在应用程序状态中存储信息可能意味着仅保留信息的一个副本(例如,相对于在会话状态或在单独页中保存信息的多个副本)。,2使用应用程序状态的缺点 (1) 应用程序范围:应用程序状态的范围可能也是一项缺点。在应用程序状态中存储的变量仅对于该应用程序正在其中运行的特定进程而言是全局的,并且每一应用程序进程可能具有不同的值。因此,不能依赖应用程序状态来存储唯一值或更新 Web应用和 Web服务器配置中的全局计数器。 (2) 数据持续性有限:因为在应用程序状态中存储的全局数据是易失的,所以如果包含这些数据的Web服务器进程被损坏(如因服务器崩溃、升级或关闭而损坏),将丢失这些数据。 (3) 资源要求:应用程序状态需要服务器内存,这可能会影响服务器的性能以及应用程序的可伸缩性。,4.3 Session对象 4.3.1 使用Session对象存储数据 ASP.NET提供了一种会话状态,该会话状态可作为HttpSessionState类或存储会话特定信息(仅在该会话中可见)的方法来使用。ASP.NET会话状态将一个有限时间窗口内来自同一浏览器的请求标识为一个会话,并在该会话持续期间保留变量的值。,可以在会话状态中存