ASP.NET2.0快速入门--存储用户配置文件
想看英文版?GOTO the following URL:
http://www.asp.net/QuickStart/aspnet/doc/profile/default.aspx
存储用户配置文件
2.0 中的新增功能
用户配置文件 -- ASP.NET 2.0 中的用户配置文件功能使您可以定义并存储要在整个应用程序中使用的基于用户的设置。而且,在用户未登录时,可以将这些设置存储在匿名配置文件中,然后在将来某个时间将其迁移到登录用户的配置文件中。
本节讨论 ASP.NET 2.0 中新的配置文件功能。
网站通常需要一个便捷方法来存储适用于站点范围的特定于用户的数据。配置文件功能为定义特定于用户的数据以及存储和检索这些用户数据提供了一种简单易用的方法。
用户配置文件是一个属性集合,这些属性定义了要为网站用户存储的信息。用户配置文件使用简单 XML 语法定义在配置文件(machine.config 和/或 web.config)中。在页中,通过 Profile 属性引用用户配置文件信息。ASP.NET 读取在配置中定义的架构,并自动生成一个可通过页上的 Profile 属性访问的类。访问 Profile 上的属性就像访问任意其他类的属性一样。
尽管配置文件功能的最常见用途是为经过身份验证的用户存储数据,但配置文件功能还支持为匿名用户存储信息。为匿名用户存储配置文件信息取决于匿名标识功能。配置文件和匿名标识功能一起工作以实现对匿名用户使用 Profile 属性。快速入门中附带的示例演示了如何将配置文件功能用于经过身份验证的用户和未经身份验证的用户。
在页生命周期开始之前,ASP.NET 确保 Profile 可供页使用。同样,在 ASP.NET 页生命周期结束时,ASP.NET 自动将 Profile 保存到基础数据存储区中。与成员资格和角色管理器等其他功能一样,配置文件功能在设计上采用了基于提供程序的模型。提供程序从由某个功能公开的类和业务逻辑为某个功能提取物理数据存储。配置文件功能附带了用于 Microsoft™ SQL Server 的提供程序。可以创建您自己的自定义提供程序,并将其配置为作用于任一配置文件功能。使用配置文件功能的页在使用自定义提供程序时将会照常运行。
除了 Profile 属性之外,配置文件功能还通过 ProfileManager 支持配置文件的管理(适用于经过身份验证的用户和匿名用户)。通过 ProfileManager 执行的常见任务包括:
搜索有关所有配置文件、经过身份验证用户的配置文件及匿名用户的配置文件的统计信息
确定在给定时间段内尚未修改的配置文件的数量
根据配置文件的上一次修改日期删除单个配置文件及多个配置文件
定义配置文件架构
下面的示例中的配置文件使用属性以及属性组定义了一个 Profile。属性是使用 <properties> 元素中的 <add> 元素定义的。属性组是一种对多个属性进行逻辑分组的简单方法。属性组用 <group> 元素定义。在该示例架构中,名为“AutomobilePreferences”的属性组将两个附加属性分在一组中。注意,不能嵌套 <group> 元素(也就是说:在 <properties> 元素下只支持一层组嵌套)。
该示例架构演示了在为配置文件属性定义数据类型方面所具有的灵活性。默认情况下,属性的类型假设为 System.String。不过,可以使用 ASP.NET 应用程序在运行时可解析的任意类型来定义配置文件属性。此示例架构包含 System.Collections.ArrayList 以及 System.Drawing.Color 的定义。
请注意,除本示例所显示的属性之外,<add> 元素还支持多种可选属性。通常,配置文件功能使用转换为字符串的类型转换,或使用 Xml 序列化来对属性进行序列化处理。但不是所有类型都可序列化为字符串或 Xml 片段。这就是为什么“PreferredBackgroundColor”属性 (Property) 有一个显式指示二进制序列化的 serializeAs 属性 (Attribute) 的原因。“PricePoint”(Property) 有一个定义此属性的默认值的 defaultValue 属性 (Attribute),当此属性的值未设置时将使用该默认值。
“PreferredBackgroundColor”属性 (Property) 还有一个设置为 true 的 allowAnonymous 属性 (Attribute)。默认情况下,配置文件属性只限于经过身份验证的用户。如果 allowAnonymous 属性 (Attribute) 设置为 true,这表示也可以使用该属性 (Property) 加载和存储匿名用户的信息。
Profile schema in web.config
匿名配置文件
上一个示例中所显示的配置文件架构同时允许经过身份验证的用户和匿名用户存储其首选背景色。在该示例页上,匿名用户可以从可选颜色中进行选择。当该页刷新后,它将使用选定颜色呈现。注意,如果关闭浏览器,然后重新运行该示例,所选颜色已经被记住。其原因在于为所有示例启用了匿名标识功能(默认情况下,匿名标识禁用)。匿名标识功能自动为匿名用户生成一个随机标识符,并将其存储在 Cookie 中。在随后访问站点时,如果检索到匿名用户的配置文件信息,Cookie 中的标识符将用作代理项“id”。
在此示例页中,使用语法 Profile.PreferredBackgroundColor 获取和设置背景色。使用 Profile 属性的编码风格与访问任何其他类的属性相同。在此示例中,该页使用 System.Drawing.Color 结构上可用的一些常见转换来获取和设置 Profile.PreferredBackgroundColor。
C# Storing Profile data for anonymous users
经过身份验证的配置文件
在此示例中,您以经过身份验证的用户身份登录并为所有配置文件属性设置值。在首次运行该示例时,您将位于匿名用户和经过身份验证的用户均可访问的主页上。您会看到背景色设置为上一示例中作为匿名用户身份登录时所选择的值。单击使您可以创建新用户的链接(该链接位于登录控件的底部)。输入用户名和密码,然后单击按钮以创建一个新用户。创建新用户后,单击按钮以继续至显示登录用户配置文件属性的页。
当使用您所有的配置文件属性首次查看该页时,您会注意到背景色设置为先前作为匿名用户身份登录时所选择的值。下一示例将会更详细地说明其中的原因。现在,您会发现您可以为所有配置文件属性设置值。此外,您还会发现汽车价格点初始设置为配置文件架构中定义的默认值。
在 HTML 窗体中输入新值后,按“Update Preferences”(更新首选项)按钮。当页刷新该属性后,更改立即生效。单击注销链接以从计算机中移除 Forms 身份验证 Cookie。然后,关闭浏览器。现在,如果您重新运行该示例,将会提示您重新登录。输入您的凭据并登录后,注意配置文件属性页正确地显示了您先前输入的信息。如果单击返回主页的链接,您会看到主页使用了您为登录用户所选择的名称和背景色。这演示了可在站点的安全页和不安全页之间如何使用配置文件属性。在主页上,将使用匿名用户的 Profile(如果尚未登录)或已登录用户的 Profile(选择登录后)显示背景色和名称。
与匿名示例一样,此示例演示了 Profile 语法如何遵循 VB.NET 和 C# 的属性访问器语法。注意,访问属性组中的属性的语法使用两层属性访问器: Profile.AutomobilePreferences.PricePoint。此属性组只充当中间属性。操作 Profile.AutomobilePreferences.CarModels 的代码演示如何将 System.Collections.Arraylist 用作 Profile 属性。键入到 HTML 窗体中的字符串应是一组以逗号分隔的名称。该页代码先将此字符串分析为字符串 System.Array,然后这些该数组值添加到 Profile.AutomobilePreferences.CarModels 属性中。在检索汽车型号时,将使用标准 for-each 语法对 Profile.AutomobilePreferences.CarModels 进行枚举操作。
C# Storing Profile data for authenticated users
将匿名配置文件迁移到经过身份验证的配置文件
上述示例演示了匿名用户的背景色转给了经过身份验证的用户。运行下面的示例可验证这一点。如果您已登录,请单击该底页部的注销链接。在主页上,从该页左上角的下拉列表中选择一种不同的颜色。主页将自行刷新,然后使用所选的背景色显示。此外,该页还显示一行文本“Hello Anonymous User”(匿名用户您好),因为 Profile 的 Name 属性只对经过身份验证的用户才受支持。使用主页上的登录控件登录到站点。注意,在登录之后,配置文件属性页中的背景色反映了先前作为匿名用户所做的选择。
在配置文件属性页上,单击返回主页的链接。注意,主页上所显示的名称基于为 Profile.Name 属性设置的值。以经过身份验证的用户身份返回主页后,从下拉列表中选择另一种颜色,然后单击更新按钮。该页将会刷新并使用更新后的背景色。如果随后单击返回配置文件属性页的链接,您将会看到背景色已被保留。
返回配置文件属性页后,单击注销链接。这会将您重定向回主页。注意,当您重定向到主页时,您先前选择的背景色将不再有效。出现此现象的原因有两方面。第一个方面,一旦您注销后,站点就会将您视为匿名用户,因此在经过身份验证的用户的 Profile 上所设置的任何背景色都无效。第二个方面,先前您以匿名用户身份登录时所做的任何颜色选择不再有效。这是因为匿名用户登录后,就会从浏览器中移除包含自动生成的匿名标识符的 Cookie。因此,如果您登录后又注销,则站点将视您为是全新的匿名用户。匿名用户和已登录用户之间的这种交互作用产生了将匿名配置文件中的数据迁移到经过身份验证的配置文件中的需求。
配置文件功能公开了一个名为 MigrateAnonymous 的事件。通过在 global.asax 中放入一个名为 Profile_MigrateAnonymous 的事件处理程序,可以订阅此事件。每当匿名标识符可用时(作为 Cookie 或作为 URL 中的无 Cookie 标证)就会激发此事件,并对当前用户进行身份验证。在该事件处理程序中,可以通过调用 Profile.GetProfile 并传入匿名 ID(匿名 ID 是可以脱离事件参数的属性之一)加载 Profile。在获得对匿名 Profile 的引用后,可以将属性设置从匿名 Profile 传送到经过身份验证的 Profile。global.asax 示例文件演示如何将背景色从匿名 Profile 传送到经过身份验证的 Profile。该代码还将从数据库中删除匿名 Profile 数据。最后,该代码调用匿名标识中的一个方法以清除包含匿名标识符的 Cookie。注意,开发人员必须显式选择从请求中清除匿名标识符,否则 ASP.NET 将不同自动清除该标识符。在 MigrateAnonymous 事件完成时,ASP.NET 将发出一个 Http 标头以从浏览器中清除匿名标识符,并且在后续页请求中,该事件将不再激发。
C# Migrating Profile data from an anonymous user to an authenticated user
用自定义基类定义配置文件属性
前面所示的 web.config 在 <profile> 元素上包含了一个名为 inherits 的属性。该属性 (Attribute) 指示 ASP.NET 通过从自定义基类继承,为 Profile 属性 (Property) 自动生成一个类。在此示例中,该类名为 UserDefinedProfileClass,并且此类位于 App_Code 目录中。该自定义类从 ProfileBase 继承,原因是为 Profile 属性自动生成的类在继承层次结构中必须始终有 ProfileBase。在自定义基类上定义的任何公共属性都是可见的,并且可通过 Profile 属性使用。
运行该示例并再次登录。在属性页上,包含垃圾食品首选项的列表框中的数据是使用自定义基类上定义的属性存储的。与 Profile 上的其他属性一样,这些食品首选项是使用下面的标准属性语法访问的:Profile.JunkFood。
定义自定义基类的好处在于:开发人员可以“截获”属性的设置和获取,并在属性 getter 和 setter 中实现复杂的业务逻辑。在该示例代码中,自定义基类使用泛型定义了一个属性。该属性定义演示了最低要求:属性实现必须调入基类,因为正是基类 (ProfileBase) 包含了用来序列化数据以及与基础提供程序进行通信的逻辑。
Profile schema in web.config
C# Using a Custom Base Class
控制配置文件的自定义保存行为
配置文件功能将自动确定 Profile 是否已更新。如果 Profile 表现为已更新,则在每次页请求结束时运行的 ProfileModule 都将调用 Profile 上的 Save 方法,从而使用配置的提供程序保存数据。不过,只有在数据类型为 System.String 或 System.Int16、System.Int32 之类的基元类型时,配置文件功能才能可靠地检测数据的更改。如果 Profile 包含更复杂的数据类型,则配置文件功能的默认行为假定 Profile 已更新,并将总是尝试保存数据。若要优化性能,开发人员可以在其页中实现确定 Profile 是否确实已更新的逻辑。如果开发人员确定 Profile 尚未更改,则可以通过在 global.asax 中编写一个事件处理程序来挂钩 ProfileAutoSaving 事件。事件参数包含一个名为 ContinueWithProfileAutoSave 的属性。如果开发人员将此属性设置为 false,则 ProfileModule 将不会尝试保存 Profile。
运行该示例,并在需要时重新登录。该页与先前使用的配置文件属性页相同,只是多加了一个按钮。如果编辑任意配置文件数据,然后单击取消自动保存行为的按钮,则在该页刷新后,将显示旧属性值。该代码示例演示了如何在 global.asax 中订阅 ProfileAutoSaving 事件,以及如何在 HttpContext.Items 集合中设置了一个属性的情况下取消保存。该页上的按钮单击事件处理程序设置此项,以指示应取消自动保存行为。
注意,如果开发人员从不希望 ProfileModule 尝试执行保存操作,则可以禁用该功能的自动保存行为,方法是将 <profile> 元素上的 automaticSaveEnabled 属性设置为 false。
C# Controlling Automatic Profile Saves
删除配置文件
站点的配置文件数据量将随着时间而增大,对于使用匿名配置文件的站点更是如此。ProfileManager 类提供了许多用于删除配置文件数据的方法。此示例演示如何使用 ProfileManager.DeleteProfile 删除当前登录用户的配置文件。在运行该示例时,您首先需要登录。登录后,单击删除按钮即可清除当前用户的配置文件数据。然后,将您重定向到配置文件属性页上。此时,您会发现您以前的所有配置文件数据都已被删除,您需要在 HTML 窗体上重新输入新的配置文件数据。
在成品环境中,您通常在计划维护任务中使用 ProfileManager。例如,您可以创建一个运行控制台应用程序的日常批处理作业,该应用程序使用 ProfileManager 删除未使用期限超过三十天的配置文件。由于配置文件功能在非 ASP.NET 环境(例如:控制台应用程序或 NT 服务应用程序)中也受支持,因此可以使用 ProfileManager 类创建面向操作的应用程序。
C# Deleting a Profile