ASP.NET 3.5核心编程学习笔记(9):用户配置文件
时间:2011-04-16 来源:辛勤的代码工
用户配置文件简介
在最抽象的层面,用户配置文件是一种由ASP.NET运行库组织到动态生成类中的属性集合。配置文件数据会按不同的用户分别保存。当程序运行页面被显示时,ASP.NET会动态创建配置文件对象,它包含开发者定义在数据模型中的相应类型的属性。该对象之后被添加到HttpContext对象中,可通过Profile属性获取。
数据模型的定义
为使用ASP.NET配置文件,我们需要先确定所要使用的数据模型结构,然后将该数据模型通过配置文件附在页面中。用户配置文件的布局定义在web.config文件中。
示例代码:
<system.web>
......
<profile>
<properties>
<add name="BackColor" type="string" />
<add name="ForeColor" type="string" />
</properties>
</profile>
</system.web>
所有通过<add>标签添加的属性会变为动态创建类的成员。
配置文件中的用户配置会被自动生成一个类,如下所示:
namespace ASP
{
public class ProfileCommon : ProfileBase
{
public virtual string BackColor
{
get { (string)GetPropertyValue("BackColor"); }
set { SetPropertyValue("BackColor", value); }
}
public virtual string ForeColor
{
get{ (string)GetPropertyValue("ForeColor"); }
set{ SetPropertyValue("ForeColor", value); }
}
public virtual ProfileCommon GetProfile(string username)
{
object o = ProfileBase.Create(username);
return (ProfileCommon)o;
}
......
}
}
该类的实例会自动与Page类的Profile属性相关联,我们可通过Profile.BackColor这类语法来访问用户配置文件的属性。
集合类型的使用
在上例中,我们使用的是单一的标量值,然后用户配置文件支持更高级的功能--集合类型和自定义类型。先看一下集合类型:
<properties>
<add name="Links"
type="System.Collections.Specialized.StringCollection" />
</properties>
非标量值必须按存储介质的要求进行序列化。serializeAs属性就是用于指示如何进行序列化的。该属性可取的值有String、Xml、Binary、ProviderSpecific。如果该属性值未被指定,默认类型为String。
自定义类型的使用
只要自定义类型为可序列化类型,就能被用户配置文件所使用。我们可自己设计类,将其编译为程序集,然后将程序集名称添加到配置文件属性的类型信息中:
<properties>
<add name="ShoopingCart"
type="My.Namespace.DataContainer, MyAssembly" />
</properties>
属性的分组
<properties>区段可接受<group>元素,它允许我们对之间相关的属性进行组织。
示例代码:
<properties> ......
<group name="Font"> <addd name="Name" type="string" defaultValue="verdana" /> <addd name="SizeInPoints" type="int" defaultValue="8" />
</group>
</properties>
与页面的交互
为启用或禁用用户配置文件功能,我们只需设置web.config文件<profile>元素的enabled属性。如果该值为false,则页面不能使用Profile属性。
匿名用户的处理
虽然用户配置文件功能主要是为被验证用户设计的,但也能够存储匿名用户的配置文件数据。要启用匿名用户,首先要开启anonymousIdentification功能。
示例代码:
<system.web>
...... <anonymousIdentification enabled="true" />
<profile>
<properties>
<add name="BackColor" type="string" allowAnonymous="true" />
<add name="ForeColor" type="string" />
</properties>
</profile>
</system.web>
上述示例使匿名用户可设置背景颜色但不能设置前景颜色。
用户配置文件属性的访问
在请求被处理前,ASP.NET会根据web.config文件中定义的用户配置文件信息动态创建一个类,页面的Profile属性会被设置为该类的实例。
个性化相关事件
请求进入处理周期之前,个性化数据会被添加到某请求的HTTP上下文中,但哪个系统组件负责个性化数据的加载呢?为此,ASP.NET引入了一种新的模块ProfileModule。
该模块本身有一对事件,分别在请求被谁后和请求即将结束时引发。如果个性化功能被关闭,该模块会立即返回,否则它会向应用程序引发Personalize事件,并加载当前用户配置文件中的个性化数据。在Personalize事件被引发时,个性化数据尚未加载。由HTTP模块引发的事件处理程序必须编写在global.asax中。
void Profile_Personalize(object sender, ProfileEventArgs e)
{
ProfileCommon profile = null
//如果当前用户为匿名用户,退出
if(User == null) return;
//管理员用户
if(User.IsInRole("Administrators"))
profile = (ProfileCommon)ProfileBase.Create("Administrator");
else
profile = (ProfileCommon)ProfileBase.Create("User");
if(profile != null)
e.Profile = profile;
}
匿名用户数据的迁移
通过分配给匿名用户唯一的ID,匿名用户也能存储和获取配置信息。但如果在某一时刻,该匿名用户决定在网站中创建一个帐户,就需要将其作为匿名用户时设置的配置信息迁移到新帐户上。
当用户以匿名身份转而登录实名帐户时,个性化模块会引发MigrateAnonymous事件。合理处理该全局事件,能将匿名用户的设置导入已验证用户的配置文件中。
示例代码:
void Profile_MigrateAnonymous(object sender, ProfileMigrateEventArgs e)
{
//获取匿名用户配置文件
ProfileCommon anonProfile;
anonProfile = Profile.GetProfile(e.AnonymousId);
//迁移匿名用户配置文件到实名用户帐户上
Profile.BackColor = anonProfile.BackColor;
......
}
用户配置文件提供程序
用户配置文件由两部分构成:访问层和存储层。
访问层提供了一个强类型模型,用于获取和设置属性值,还可以对用户身份进行管理。它会确保获取和存储的数据针对的是当前已登录的用户。
存储导使用特殊的提供程序来执行与存取数据有关的任务。
用户配置文件提供程序的配置
默认的提供程序由web.config文件描述相应功能区段的defaultProvider属性指定。默认情况下,如果未指定提供程序,将默认使用特定功能提供程序集合中的第一项。
默认配置文件提供程序名为AspNetSqlProfileProvider,使用SQL Server 2005 Express作为数据存储。如下所示:
<profile>
<providers>
<add name="AspNetSqlProfileProvider"
ConnectionStringName="LocalSqlServer"
applicationName="/"
type="System.Web.Profile.SqlProfileProvider" />
</providers>
</profile>
上述代码摘自machine.config文件。这里的LocalSqlServer不是到本地或远程SQL Server实例的连接字串,而是配置文件<connectionStrings>区段中的数据项名称。
自定义的用户配置文件提供程序
我们可以编写自定义的用户配置文件提供程序,但自定义的用户配置文件提供程序类应继承于ProfileProvider类。