ASP.NET 3.5核心编程学习笔记(9):用户配置文件

用户配置文件简介

  在最抽象的层面,用户配置文件是一种由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类。

阅读更多
个人分类: asp.net
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭