1、第8章 模块7站点发布8.1 【任务任务15】站点发布站点发布【本章提要本章提要】当Web应用系统开发完成后,需要交付给客户一个完整的安装包文件,以方便客户将应用系统部署到指定的Web服务器中。本章围绕该站点发布任务的实现,介绍了Web应用系统的认证与授权,并详细阐述了系统跟踪与检测的方法。【学习目标学习目标】掌握Web的认证与授权。掌握系统跟踪检测的方法。掌握站点打包和发布的步骤。任务描述任务描述在校园在线超市系统的开发过程中,为了减少应用程序的性能开销,将商品栏目做成用户控件缓存起来,以后的请求将访问缓存信息,并对站点进行安全配置;在站点开发完成之后,需要交付给客户一个完整的安装包文件,以
2、便客户方便地通过Windows安装包将站点部署到指定的Web服务器中。8.1 【任务任务15】站点发布站点发布 必备知识必备知识知识知识1 Web的认证与授权的认证与授权因特网虽然是一个面向全球的开放型网络系统,但有些网页并不是对所有用户都无条件开放的。例如,一些用于公司内部管理的网页只对公司内部的人员开放,有些网站设立的收费项目只对那些进行了注册,并交纳了费用的用户开放,有些商业网站实行“会员制”,只有经过注册的会员才有权参见某些商业交易活动。这些类似的情况都给网站设计提出了新的要求:为了网站的合法权益和网络安全,必须对一些特定的网页实施保护,当用户进入时要进行身份认证,并在认证的基础上分配
3、资源。1Web的认证的认证1)Web的认证机制认证是一个过程,用户可以通过这个过程来验证他们的身份,通过系统验证后的标识可以定位到唯一的用户。通常情况下,用户需要输入其用户名与密码,或者根据已有凭据进入登录页面。ASP.NET提供了三种不同的认证机制,如表8-1所示。表8-1 三种认证机制通过这三种不同的机制,可以使用不同的方式来保存用户的登录信息,包括用户密码等敏感数据。在应用程序中启用认证,即在Web.config文件的/节点中进行配置,其代码如下:.其中,mode是必选属性。mode指定应用程序的默认身份认证模式,可选值为Windows、Forms、Passport或None,默认值为W
4、indows。Windows:将Windows认证指定为默认的身份认证模式。将它与以下任意形式的IIS身份认证结合起来使用:基本、摘要、集成Windows身份认证或证书。在这种情况下,应用程序将身份认证责任委托给IIS。Forms:将ASP.NET基于窗体的身份认证指定为默认身份认证模式。Passport:将Microsoft Passport Network身份认证指定为默认身份认证模式。None:不指定任何身份认证,应用程序仅支持匿名用户,否则它将提供自己的身份认证。2)ASP.NET中的认证过程在ASP.NET中,认证和授权都可以看做是在处理一系列的模块。ASP.NET认证和授权过程如图
5、8-1所示。图8-1 ASP.NET认证和授权过程当从IIS传递一个请求时,ASP.NET将初始化HttpRuntime、HttpApplication、HttpContext等一系列对象。在整个请求生命周期中,HttpContext对象用于传递有关请求和响应的详细信息。创建HttpApplication对象后,系统首先执行认证模块,通过这些模块的执行,将会更改HttpContext对象中的User属性。认证模块执行完成之后,接着执行授权模块。在执行过程中,ASP.NET只加载一个身份认证模块,这取决于该配置文件的authentication元素中指定了哪种身份认证模式。该身份认证模块创建一个
6、IPrincipal对象,并将它存储在HttpContext.User属性中,其他授权模块则使用这个对象做出授权决定。3)Windows认证如果用户在Intranet上,且他们已经被分配域账户和组,就可以使用Windows身份认证。在使用Windows认证时,IIS首先向操作系统请求身份认证。通过后,IIS将向ASP.NET传递代表身份认证的用户或匿名用户账户的标识。该标识被包含在IPrincipal对象的Identity子对象中,且可以通过HttpContext.User属性来访问IPrincipal对象和Identity对象。启用Windows认证来保护ASP.NET网站有两个步骤:配置I
7、IS。在Web.config中设置身份验证。(1)配置IIS配置IIS使用匿名身份验证和一个或多个下面的身份验证机制:基本。摘要式。集成Windows。(2)设置身份认证在Web.config中节的子节中,设置身份认证方法为Windows身份认证,代码如下:4)Forms认证Windows认证仅仅是当用户拥有Microsoft Windows账户时才有用。如果正在构建一个基于Internet的ASP.NET站点,则使用Windows认证显然不行。因此,你可能会想到在其他地方存储用户账户而不是存储在操作系统中,如将用户凭据存储在数据库中。事实上,在多数情况下,都需要建立自己的用户管理和存储机制。
8、Forms认证模式能够让你轻易地创建这样一个自定义的安全机制,并安全地执行它。(1)Forms认证机制Forms认证使用用户登录到站点时创建的身份认证信息,然后在整个站点内跟踪该用户。身份认证信息通常包含在一个Cookie中。然而,ASP.NET 2.0版支持无Cookie Forms身份认证,所以将身份认证信息保存在查询字符串中。如果用户请求一个需要经过身份认证的访问页,且该用户以前没有登录过该站点,则该用户重定向到一个配置好的登录页。该登录页提示用户提供凭据(通常是用户名和密码),然后,将这些凭据传递给服务器,并针对用户存储进行认证。在ASP.NET2.0中,用户存储访问可由成员身份提供程
9、序处理,对用户的凭据进行身份认证后,用户重定向到原来请求的页面。Forms认证的过程如图8-2所示。图8-2 Forms认证过程该流程的详细说明如下:用户请求应用程序的虚拟目录下的Default.aspx文件。因为IIS中启用了匿名访问,因此IIS允许该请求。服务器查找一个身份认证Cookie。如果找不到该身份认证Cookie,则用户重定向到配置好的登录页(Login.aspx),该页由forms元素的LoginUrl属性指定。用户通过该页面提供和提交凭据。浏览器请求Login.aspx页,并在查询字符串的RETURNURL参数中包括起始页的相关信息。服务器返回登录页以及200 OK HTTP
10、状态代码。用户在登录页输入凭据,并将该页发送回服务器。服务器根据某个存储认证用户凭据。登录页中的代码创建一个包含为该会话设置的Forms身份认证信息的Cookie。在ASP.NET 2.0中,可以通过成员身份系统执行对用户凭据的认证。对于经过身份认证的用户,服务器将浏览器重定向到查询字符串中的RETURNURL参数指定的原始URL。重定向之后,浏览器再次请求Default.aspx页。该请求包括身份认证Cookie。FormsAuthenticationModule类检测Forms身份认证Cookie,并对用户进行身份认证。身份认证成功后,FormsAuthenticationModule类使
11、用有关经过身份认证的用户的信息填充当前的User属性。由于服务器已经验证了身份认证Cookie,因此它允许访问并返回Default.aspx。(2)在Web.Config中配置Forms认证当配置Forms认证的时候,可以指定一个登录页面。当用户对应用程序中的页面发出请求时,如果他们没有通过认证,就会被重定向到登录页面,在那里他们能够输入凭据。对于输入的凭据,必须通过编写代码进行相应处理。当用户通过认证后,就被重定向到他们最初所请求的页面。以下配置文件片段显示了如何在Web.Config中设置Forms认证:5)Passport认证Passport认证是一种Microsoft提供的集中认证服务
12、。用户可以使用Microsoft.NET Passport来访问服务,如Hotmail、Messenger。如果用Passport服务注册了自己的站点,用户就可以使用相同的Passport来访问自己的站点,不需要记住不同系列的凭据。表8-2 Forms认证配置项说明2Web的授权的授权在用户通过认证,并能够访问Web站点之后,应用程序必须确定用户可以访问的页面和资源,即授权。在ASP.NET中包括文件授权和URL授权。1)文件授权文件授权是Windows操作系统提供的一种授权机制,我们可以为NTFS文件系统格式的盘符中的任意文件或者文件夹设置权限。这些权限存储在访问控制列表(ACL)中,这个列
13、表是与文件存储在一起的。ASP.NET文件授权模块可以使用这些权限来控制对Web应用程序中资源、页面和文件夹的访问。要使用File授权,需要首先配置应用程序,使其可以使用Windows认证,然后为Web站点中的文件和文件夹分配权限。在Web.Config文件中,将系统配置为Windows认证和文件授权,并且在Web站点中指定相应目录或文件的权限,那么,整个认证和授权的过程将在ASP.NET的帮助下自动完成。2)URL授权通过URL授权可以显式地允许或拒绝某个用户名和角色对特定目录的访问权限。为此,应在该目录的配置文件中创建一个authorization节。若要启用URL授权,可在配置文件的au
14、thorization节中的allow或deny元素中指定一个用户或角色列表。为目录建立的权限也会应用到其子目录,除非子目录中的配置文件重写这些权限。Authorization节的基本格式如下:Allow与deny元素必选其一,分别表示授予访问权限和撤销访问权限。users与roles必选其一,也可同时包含二者,verbs属性为可选项,其属性说明如表8-3所示。表8-3 authorization中元素属性说明下面的例子对Rose用户和Admins角色的成员授予访问权限,对John用户(除非Admins角色中包含John用户)和所有匿名用户拒绝访问权限。下面的例子允许对John用户授予访问权限
15、,并拒绝所有其他用户的访问权限。下面的例子允许对John用户、Kim用户授予访问权限。下面的例子允许所有用户对某个资源执行HTTP GET操作,但是只允许Rose用户执行POST操作。由于系统中存在多个配置文件,因此在执行时可能要对这些配置项进行合并。合并的规则如下:应用程序级别的配置文件中包含的规则优先级高于继承的规则。系统通过构造一个URL的所有规则的合并列表,规则的优先级别由列表中规则的排列顺序所确定。给定应用程序的一组合并的规则,ASP.NET从列表头开始检查规则,直至找到第一个匹配项为止。ASP.NET的默认配置包含向所有用户授权的元素。如果其他授权规则都不匹配,则允许该请求。如果找
16、到匹配项,并且它是deny元素,则向该请求返回401 HTTP状态代码。如果与allow元素匹配,则模块允许进一步处理该请求。还可以在配置文件中创建一个location元素,以指定特定文件或目录,location元素中的设置将应用于这个文件或目录。3利用控件创建安全页利用控件创建安全页ASP.NET 2.0 提供了一组用户管理控件,这些控件中大多数都不是单一的标准控件,而是多个控件的组合。利用这些控件可以非常方便地完成用户的认证和授权。这些控件包括:Login:用户登录控件。CreateUserWizard:创建新用户控件。LoginView:登录视图控件。LoginName:登录用户名控件。
17、LoginStatus:登录状态控件。ChangePassword:改变密码控件。PasswordRecovery:恢复密码控件。1)用户登录控件用户登录控件(Login)是基于角色的安全技术的核心控件。该控件的作用是进行用户认证,确定新到的用户是否已经登录。该控件的界面如图8-3所示。图8-3 用户登录控件的界面该控件的代码如下:Login控件实质上是一个“用户控件”,它不仅生成了显示界面,还定义了相应的行为。它为ASP.NET网站进行了安全配置后会自动生成ASPNETDB数据库,而且数据表的表名、字段名以及位置都已经固定,因此只要将Login控件拖入到页面中,不需要编写任何代码,也不需设置
18、任何其他属性就可以使用。表8-4 Login控件的属性表8-5 Login控件的常用方法2)创建新用户控件利用CreateUserWizard(创建新用户)控件可以在登录表中增添新用户,并为新用户登记相应的参数。该控件的界面如图8-4所示。图8-4 创建新用户控件界面该控件的代码如下:在ASP.NET 2.0中,对密码的设置比较严格。默认情况下,密码的设置符合“强密码”的要求。强密码必须满足:至少7个字符。字符中至少包括一个大写或小写的字母。字符中至少包括一个非数字亦非字母的特殊符号,如“!”、“”、“#”、“$”、“.”等。3)登录状态与登录用户名控件一般的登录模块,当用户成功登录后,会显示
19、用户当前登录的身份,比如“欢迎*用户登录”的提示,而同时会显示“LOGOUT(退出)”的提示。可以使用LoginName和LoginStatus控件来实现这一功能。LoginName用来显示注册用户的名字,通过FormatString属性可以增加一些格式的描述。如果用户没有被认证,这个控件就不会在页面上产生任何输出。而“LoginStatus(登录状态)”控件则提供了一个方便的超链接,它会根据当前验证的状态,在登录和退出操作之间进行切换。如果用户尚未经过身份认证,则显示指向登录页面的链接;如果用户已经进行了身份验证,则显示使该用户能够退出的链接。利用不同的属性,这两个显示的内容都是可以被修改的
20、。通常可以根据登录和退出的状态在控件上加上照片等个性化的东西。这两个控件的代码如下:4)登录视图控件在早期的版本里,区分不同角色、浏览不同页面需要用代码来实现,这样做比较麻烦。ASP.NET2.0提供了一个十分有用的控件,即LoginView。LoginView结合导航控件能够根据当前用户的角色自动显示不同的导航界面,实现基于角色的网站浏览功能。默认情况下,该控件只包括两个模板:匿名(未登录)模板(Anonymous)和已登录模板(LoggedIn),可以对匿名用户和已登录的用户分别显示不同的导航界面。如果在应用项目中设置了多个不同的角色时,控件将自动增加不同的模板,用来为不同角色显示不同的导
21、航界面。每个登录后的用户将只能按照自己所充当的角色查看自己权限以内可以访问的网页,从而可以直观地保护网页。然而这只是视图上的保护,并不能代替Web.config文件的作用。一些用户还有可能直接利用URL进入受保护的网页。因此视图的保护还应该和Web.config相结合才能既有效又方便地保护网页。5)恢复密码控件和改变密码控件有开发经验的人都知道,在以前,如果用户忘记了密码而要重新获得密码是比较麻烦的事情,为了实现这一功能,需要编写代码,包括认证用户、检查数据库、修改数据库等。ASP.NET 2.0提供了一个很有吸引力的控件,即PasswordRecovery(恢复密码)控件。该控件能够通过电子
22、邮件来帮助恢复忘记的密码。只要用户在注册时正确地填写了邮箱地址,且配置正确并在该控件里提交了请求,它就会自动把密码发送到你的邮箱中。图8-5 恢复密码控件界面 图8-6 改变密码控件界面PasswordRecovery控件提供了三种模板:UserName,用于初始化控件,用户需要在这里填上登录名。Question,在用户寻找遗忘的密码时必须回答的问题。Answer,用于当用户输入的密码正确,或者已经用E-mail发给用户的时候。在PasswordRecovery控件中,还有一些重要的事件:BeforeUserLookup,当用户查找用户资料的时候被激发。可以设定个人测试条件取消这个过程。Use
23、rLookupError,当用户名不存在时激发。BeforeAnswerLookup,在用户输入了答案并且被验证后激发。AnswerLookupError,当输入答案错误时被激发。BeforeSendMail,在邮件发送之前被激发。4直接调用直接调用Membership API方法方法为了对成员身份进行更高级别的控制,可以直接使用Membership API方法。在System.Web.Security命名空间中主要包括两个类:Roles类和RolePrincipal类。Membership API是Membership类中公有的方法,利用这些方法能够完成以下工作:创建新用户、更改密码、搜索与
24、特定条件匹配的用户、创建角色、删除角色、读取所有角色、读取某个用户分配的角色和读取某个角色的用户等。下面的例子说明了Membership类的一些常用的方法。1)创建新用户在页面中添加6个文本框以及一个按钮,其中:TextBox1用于输入新用户名。TextBox2用于输入新用户密码。TextBox3用于输入新用户的E-mail。TextBox4用于输入安全提示问题。TextBox5用于输入回答问题。Label1用于输出提示错误。按钮的代码如下:protected void Button1_Click(object sender,EventArgs e)if(this.IsValid)Member
25、shipCreateStatus status;MembershipUser user=Membership.CreateUser(this.TextBox1.Text,TextBox2.Text,TextBox3.Text,TextBox4.Text,TextBox5.Text,false,out status);switch(status)case MembershipCreateStatus.Success:FormsAuthentication.RedirectFromLoginPage(user.UserName,false);break;case MembershipCreateS
26、tatus.DuplicateEmail:Label1.Text=email地址已经登录;break;case MembershipCreateStatus.DuplicateUserName:Label1.Text=用户已经登录;break;case MembershipCreateStatus.InvalidEmail:Label1.Text=email地址格式不对;break;case MembershipCreateStatus.InvalidPassword:Label1.Text=密码不对;break;case MembershipCreateStatus.UserRejected
27、:Label1.Text=登录失败,原因不清楚;break;2)创建新角色protected void Button1_Click(object sender,EventArgs e)if(TextBox1.Text.Length 0)Roles.CreateRole(TextBox1.Text);3)删除角色protected void Button1_Click(object sender,EventArgs e)Roles.DeleteRole(DropDownList2.SelectedItem.Text);4)给用户分配角色protected void Button1_Click(o
28、bject sender,EventArgs e)Roles.AddUsersToRole(DropDownList1.SelectedItem.Text,DropDownList2.SelectedItem.Text);5)从角色中删除用户protected void Button1_Click(object sender,EventArgs e)Roles.RemoveUserFromRole(DropDownList1.SelectedItem.Text,DropDownList2.SelectedItem.Text);知识知识2 跟踪检测跟踪检测1跟踪概述跟踪概述通过跟踪技术,可以查看
29、有关对ASP.NET页请求的诊断信息,并且允许在代码中直接编写调试语句,而不必在将应用程序部署到成品服务器时从应用程序中删除这些语句,仅仅通过设置编译开关就可以完成。例如,可以在页面中设置变量或结构,断言是否满足某个条件,或者只是跟踪通过页面或应用程序的执行路径,并将一些关键变量值输出(通过Trace输出,也称自定义输出),从而帮助我们诊断系统是否正确执行。ASP.NET跟踪机制将消息写入并显示在ASP.NET网页和ASP.NET跟踪查看器(Trace.axd)。可以直接查看追加到页面末尾的跟踪信息,也可以用单独的跟踪查看器查看(Trace.axd),或者同时用这两种方法查看。若要通过跟踪查看
30、器查看,则一般在浏览器中定位到Web应用的根目录(如http:/localhost/SuperMarketWebSite),在后面加上trace.axd,即http:/localhost/SuperMarketWebSite/trace.axd,便可打开跟踪查看器。其界面如图8-7所示。图8-7 跟踪查看器图8-8 跟踪输出消息表8-6 跟踪信息输出说明图8-9 跟踪信息的详细信息跟踪信息的详细信息显示了页面生命周期中的事件和用户自定义的输出消息,从中可以了解到各事件方法运行的时间以及相关变量的输出等,从而帮助我们对应用执行情况进行分析。2页面级跟踪页面级跟踪可以控制是否启用单个页面的跟踪。如
31、果启用了跟踪,在请求该页时,ASP.NET会为该页附加一系列的表,表中包含关于该页请求的详细执行信息。默认情况下,ASP.NET网页是禁用跟踪的。在页面文件(.aspx)的Page指令中设置Trace属性为true,即可启用页面级跟踪。代码如下:还可以设置TraceMode属性,以指定跟踪消息出现的顺序。该属性包括SortByTime和SorttByCategory,前者将按跟踪消息的处理顺序对跟踪消息进行排序,后者则按在页或服务器控件代码的System.Web.TraceContext.Warn和System.Web.TraceContext.Write方法调用中指定的类别对消息进行排序。默
32、认值为SortByTime。在实际开发中,经常需要对某些关键变量进行跟踪,或者是执行到一段代码后需要给出提示消息等。对于这些消息的输出,可通过Page类的Trace属性来完成。Trace属性返回当前Web请求的TraceContext对象,该对象捕获并提供有关Web请求的详细信息,通过调用它的方法(Write和Warn)可将消息追加到特定的跟踪类别。Write和Warn都可将跟踪信息输出,只是后者输出的文本显示为红色。下面的代码启用页面(default.aspx)的页面级跟踪,并在页面的默认事件(Page_Load)中自定义输出消息:protected void Page_Load(objec
33、t sender,EventArgs e)Trace.Write(ASPNET_TRACE,Page_Load);上面代码中,通过将消息“Page_Load”输出到ASPNET_TRACE类别来浏览页面,并查看跟踪信息,界面如图8-10所示。图8-10 查看跟踪信息3应用程序级跟踪应用程序级跟踪通过对应用程序的Web.config文件进行配置,而不必对各个页进行更改以启用或禁止跟踪,就可以在所有页(除显示设置跟踪的页)中控制是否显示跟踪信息。页面级的跟踪设置将覆盖应用程序级的设置。也就是说,即使应用程序级启用了跟踪,如果在页面中通过显式设置禁用了跟踪,该页面上也不会显示跟踪信息。或者说在应用程
34、序级禁用了启用跟踪,而在页面上启用跟踪,也可以查看该页的跟踪信息。在Web.config文件中,通过对节点进行设置,即可启用或禁用应用程序级跟踪。节点的相关配置属性如表8-7所示。表8-7 节点的相关配置属性假设要为应用配置跟踪,要求最多可收集40个请求的跟踪信息,并允许使用服务器以外的计算机上的浏览器显示跟踪查看器,则其代码如下:通过该配置,我们在浏览应用中的任何页面时,都将看到跟踪消息,但若页面的Page指令中禁用了跟踪,将不会看到任何跟踪信息。知识知识3 缓存技术缓存技术1缓存概述缓存概述通常情况下,应用程序可以将那些频繁访问的数据以及那些需要大量处理时间来创建的数据存储在内存中,从而提
35、高性能。例如,如果应用程序使用复杂的逻辑来处理大量数据,然后将数据作为用户频繁访问的报表返回,将避免在用户每次请求数据时重新创建报表,从而可以提高效率。反之,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页,这会使工作效率低下。在这种情况下,为了提高应用程序的性能,ASP.NET使用两种基本的缓存机制来提高缓存功能:第一种机制是应用程序缓存,它允许用户缓存生成的数据,如DataSet或自定义报表业务对象;第二种机制是页输出缓存,它保存页处理输出,并在用户再次请求该页时,重用所保存的输出,而不是再次处理该页。1)应用程序缓存应用程序缓存提供了一种编程方式,
36、可通过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。使用应用程序缓存的优点是它由ASP.NET管理缓存,会在项过期、无效或内存不足时自动删除缓存中的项。还可以通过对应用程序缓存配置,实现在删除项时通知应用程序的功能。使用应用程序缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用;如果该项不存在,则可以重新创建该项,然后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。2)页输出缓存页输出缓存指在内存中存储处理后的ASP.NET页的内容
37、。这一机制允许ASP.NET直接向客户端发送页响应,而不必再次经过页处理生命周期。页输出缓存对于那些不经常更改但需要大量处理才能创建的页特别有用。可以分别为每个页配置页缓存,也可以在Web.config文件中创建缓存配置文件。利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。页输出缓存提供了两种页缓存模型:整页缓存和部分页缓存。整页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求。部分页缓存允许缓存页的部分内容,其他部分则为动态内容。部分页缓存可采用两种工作方式:控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后将该用户控件标
38、记为可缓存的,以此来缓存页输出的部分内容。这一方式可缓存页中的特定内容,但不缓存整个页,因此每次都需重新创建整个页。例如,如果要创建一个显示股票信息的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间内为静态的页,则可以将整个页设置为进行缓存。如果向页添加一个显示用户名的Label控件,则对于每次页刷新和每个用户而言,Label的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。但是,使用缓存后替换机制,可以将页配置为进行缓存,但将页的
39、个别部分标记为不可缓存。在此情况下,可以向不可缓存部分添加Label控件,这样将为每个用户和每次页请求动态创建这些控件。2应用程序缓存应用程序缓存应用程序缓存是由System.Web.Caching.Cache类实现的,缓存实例(Cache对象)是每个应用程序专用的,并且每个应用程序只有一个,通过Page类或UserControl类的Cache属性公开。缓存生存期依赖于应用程序的生存期,当重新启动应用程序后,将重新创建Cache对象,也就是说缓存数据将被清空。可以使用Cache对象访问应用程序缓存中的项,使用Cache对象的Insert方法向应用程序缓存添加项,以设置依赖项、过期策略和删除通知
40、。如果使用Insert方法向缓存添加项,并且已经存在与现有项同名的项,则缓存中的现有项将被替换。因此,可以使用Insert方法修改缓存项的内容。还可以使用Add方法向缓存添加项。使用此方法,可以设置与Insert方法相同的所有选项;然后,Add方法将返回添加到缓存中的对象。另外,如果使用Add方法,并且缓存中已经存在与现有项同名的项,则该方法不会替换该项,也不会引发异常。1)将项添加到缓存中(1)添加缓存项 通过键和值直接设置项。可以将项以键/值对的形式存放在Cache中,同样可以通过键来检索这些项。在下面的例子中,将产品分类信息缓存起来:CacheProductCategories=dsCa
41、tegories;通过Insert方法将项添加到缓存中。可以通过Cache类的Insert()方法传递键和值来添加项,代码如下:Cache.Insert(ProductCategories,dsCategories);表8-8 缓存项的依赖项(2)设置缓存依赖项在ASP.NET中,可以为缓存项添加的依赖项如表8-8所示。在向缓存中添加项时,可以为Cache对象的Insert或Add方法传递CacheDependncy对象(或SqlCacheDependncy对象)的一个实例,以添加上述列表中的这些缓存依赖项。如果具有关联依赖项的项发生更改,缓存项便会失效,并从缓存中删除。添加缓存项的键依赖项。
42、有时候,某个缓存项依赖于另外一个依赖项,一旦依赖项被更改,缓存项就被删除。例如,向缓存中添加一个缓存项CacheItem2,该项依赖于缓存中的另一个项CacheItem1。代码如下:Cache.Insert(CacheItem2,CacheValue2,newSystem.Web.Caching.CacheDependency(null,new string CacheItem1);上面代码向CacheItem2添加依赖项CacheItem1,因此,只要CacheItem1发生变化,则CacheItem2立即从缓存中删除。其实,可以向CacheDependency构造函数的第二个参数(字符串数
43、组)传递多个缓存键,一次添加多个缓存依赖项。也就是说,只要其中任一个缓存项发生变化,则CacheItem2将被删除。添加缓存项的文件依赖项。缓存依赖项还可以依赖于一个文件,一旦文件被修改或删除,缓存项就被删除。例如,如果编写一个处理XML文件中的财务数据的应用,则可以从该文件将数据插入缓存中,并在此XML文件上保留一个依赖项。当该文件更新时,从缓存中删除该项,而应用程序将重新读取XML文件,然后将刷新后的数据放入缓存中。代码如下:Cache.Insert(CacheItem2,CacheValue2,new System.Web.Caching.CacheDependency(Server.M
44、apPath(XMLFile.xml);添加缓存项的SQL依赖项。在实际应用中,往往需要将数据库中的某个表的记录缓存起来。但是,由于数据库中的记录是随时变化的,如被某个用户修改了记录或添加、删除了记录等,在这种情况下,就可以为缓存项添加SQL依赖项,当数据库记录发生变化时自动删除缓存项。在ASP.NET中,通过使用SqlCacheDependency对象来创建依赖于数据库中的记录:首先,在Web.config文件的caching节点定义缓存使用的数据库名称,代码如下:上面的配置文件中,ConnectionString1为数据库连接名称。接着,就可以创建依赖于该连接对应数据库的某个表的缓存项了,
45、代码如下:Cache.Insert(CacheItem2,CacheItem2,newSystem.Web.Caching.SqlCacheDependency(mydb,mytable);当数据表mytable的记录发生变化时,SQL Server会自动通知ASP.NET,从而删除缓存项。(3)设置缓存过期策略Cache类提供了强大的功能,允许用户自定义如何缓存项以及将它们缓存多长时间。例如,当系统内存不足时,缓存会自动删除很少使用的或优先级较低的项以释放内存。该技术也称为清理,这是缓存确保过期数据不占用宝贵的服务器资源的方式之一。对于存储在缓存中的易失项(如那些定期进行数据刷新的项或那些只
46、在一段时间内有效的项),通常设置一种过期策略:只要这些项的数据保持为最新的,就将它们保留在缓存中。例如,如果用户正在编写一个应用程序,该应用程序通过另一个站点获取数据来跟踪体育比赛的比分,那么只要源站点上比赛的比分不更改,就可以缓存这些比分,在此情况下,可以根据其他站点更新比分的频率来设置过期策略。也就是说,用户可以编写代码来确定缓存中是否是最新的比分,如果该比分不是最新的,则代码可以从源站点读取比分并缓存新值。当使用Add或Insert方法将项添加到缓存时,都可以建立项的过期策略。可以通过使用DateTime值指定项的确切过期时间(绝对过期时间)、定义项的生存期。也可以使用TimeSpan值
47、指定一个弹性过期时间(可调性过期时间)。可调性过期时间允许用户根据项的上次访问时间来指定该项过期之前的运行时间。一旦项过期,ASP.NET便将它从缓存中删除,试图检索它的值的行为将返回null,除非该项被重新添加到缓存中。在下面的例子中,添加一个绝对过期的缓存项,通过指定具体的过期时间(30分钟),从创建项开始计时,当时间满30分钟后,该缓存项将被删除。Cache.Insert(CacheItem2,CacheItem2,null,DateTime.Now.AddMinutes(30),System.Web.Caching.Cache.NoSlidingExpiration);同样,可以将缓存
48、项的过期策略设置为可调性过期。代码如下:Cache.Insert(CacheItem2,CacheItem2,null,System.Web.Caching.Cache.NoAbsoluteExpiration,new TimeSpan(0,30,0);(4)设置缓存的优先级在ASP.NET中,当对已过期的缓存项执行清理时,将根据在创建缓存项时指定的优先级来进行清理。也就是说,在服务器释放系统内存时,级别越低的缓存项越容易被清理。一般可以在使用Add或Insert方法添加项时指定一个CacheItemPriority枚举值,该枚举具有的成员如表8-9所示。当使用Add或Insert方法创建缓存
49、项时,可以通过传递参数CacheItemPriority指定其优先级。代码如下:Cache.Insert(CacheItem2,CacheItem2,null,System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.CacheItemPriority.High,null);表8-9 CacheItemPriority枚举值2)读取缓存项由于缓存项在Cache中都是以键/值对形式存储的,因此,可以通过键来检索被缓存的项。代码如下:if(CacheCategories!=null)DataSet dsCategories=(
50、DataSet)CacheCategories;如上述代码所示,在读取缓存项时,一般首先判断该缓存项是否存在,然后再进行访问。3)从缓存中删除项ASP.NET缓存中的数据是易失的,即不能永远保存。一般由于以下原因,缓存中的数据可能会自动删除:缓存已满。该项已过期。依赖项发生更改。除了允许从缓存中自动删除项之外,还可以显式删除项。下面,通过调用Cache类的Remove()方法来删除缓存项。代码如下:Cache.Remove(Categories);3页输出缓存页输出缓存1)页输出缓存概述通过ASP.NET可以缓存ASP.NET页所发生的部分响应或所有响应。在ASP.NET中,将这种技术称为输出