ASP.NET 的配置文件功能允许开发人员针对每个用户指定设置或数据。所有这些数据都可以存储在一个匿名配置文件中,从而无需用户登录网站即可对这些设置进行检索。但是,如果用户创建一个帐户,这些设置也可以迁移到已登录的配置文件中。您也可以选择关闭匿名配置文件功能。
要存储一个用户的配置文件属性并对其进行检索,只需将每个配置文件属性命名并添加到 web.config 文件内的配置文件元素即可,如图 1 所示。这样便将配置文件属性放入配置文件的 SettingsPropertyValueCollection 中。您也可以为每个属性指定数据类型和一个默认值。
ASP.NET 会读取 web.config 文件以查找配置文件分区组。如果能找到分区组,ASP.NET 会接着查找一个类型字符串/连接字符串属性(未在图 1 中示出)。如果未发现分区组,则会检查 machine.config 文件。多数情况下,由于安装了 ASP.NET,machine.config 文件通常不会被修改。默认情况下的 machine.config 文件含有 System.Web.Profile.SqlProfileProvider,它在系统中注册为配置文件功能的默认提供程序。SqlProfileProvider 按规定要使用 LocalSqlServer 连接字符串名称来连接目标数据库,以获得配置文件信息(所有的连接字符串名称和属性均存储在名为 connectionStrings 的组中,您可以在 web.config 文件中找到它)。默认情况下,LocalSqlServer 连接字符串被定义为一个 SQL Server™ 2005 Express 数据库,您可以在 |DataDirectory|aspnetdb.mdf(在 ASP.NET 中转换为 \App_Data\aspnetdb.mdb)中找到该数据库。
SqlProfileProvider 存储配置文件信息所用的数据库必须使用一种已知架构进行配置。如果一个 SQL Server 2005 Express 数据库正在使用中,ASP.NET 可以根据需要动态地创建数据库文件和必需的表格、视图和存储过程等等。否则,可使用 Microsoft® .NET Framework SDK 中提供的 aspnet_regsql 工具。aspnet_Profile 表格是上述表格中的一种,它可以用于存储每位用户的配置文件信息。用户在向其配置文件分配一个配置文件属性时,会在表格中新添加一行,其中含有用户的唯一 UserID,每个配置文件属性名包含在单独的一列中,与每个配置文件名相关的数据则包含在另一列中。在图 2 中,您会发现数据将以 BLOB 类型存储。属性名和属性值可以以各种数据格式存在,其中包括连续字符串、XML 数据集或二进制序列化数据。因此,使用内置的配置文件提供程序存储配置文件数据使开发人员或数据库管理员难以使用 SQL 来查询或修改数据。如果默认的提供程序的功能无法完全满足您的需要,您可以使用自定义的提供程序。
ASP.NET 团队在开发新版本的 ASP.NET 的同时,也在全力以赴增强现有版本的功能。他们开发了名为 Sandbox 项目的众多实用资源,您可以从 ASP.NET 的官方网站 sandbox.asp.net 下载这些资源。其中很多项目都有一个非常酷的特点,即它们可以应用于生产环境。您可以在这里找到一些最酷的 ASP.NET 加载项,其中包括 Web Deployment Project(Web 部署项目)和 Table Profile Provider Samples(表格配置文件提供程序示例)。在本项目中,我将使用 Table Profile Provider Samples,您可以从 asp.net/sandbox/samp_profiles.aspx?tabid=62 获得。
与内置的 ASP.NET 配置文件提供程序不同,Table Profile Provider Samples 允许配置文件数据以一种易于读取的格式进行存储。下载包中包含两个示例提供程序及其使用说明。SqlTableProfileProvider 允许数据以单列的形式存储在一个配置文件表格中。该表格中必须包含 UserID 唯一标识符(作为主关键字)和 LastUpdatedDate 日期时间字段。UserID 字段可允许每条配置文件记录与 aspnet_Membership 和 aspnet_Users 表格中包含的用户帐户建立关联。您会发现上述任何字段均无需在 web.config 文件中进行指定。另外一个配置文件示例,即 SqlStoredProcedureProfileProvider,将每个配置文件属性的值传递到一个 SQL 存储过程的一个单独参数内。该选项允许存储过程将配置文件属性存储在其最上方,并通过业务逻辑对数据进行转换,然后再存储这些数据。
在将这些示例用于 ASP.NET 项目之前,您必须先将这些示例的代码复制到 App_Code 文件夹中。这些代码是采用 C# 编写的,因此如果您使用 Visual Basic® 语言开发应用程序,需要将这些示例放在 App_Code 文件夹下的某个单独文件夹内。这个单独文件夹必须作为一个代码子目录添加到 web.config 文件中,如下所示:
<compilation debug="true" strict="false" explicit="true"> <codeSubDirectories> <add directoryName="ProfileProvider" /> </codeSubDirectories> </compilation>
通过将该文件夹添加为一个代码子目录,文件夹中的所有 C# 文件都将与 Web 应用程序项目的其他文件分开单独编译。在运行期间,ASP.NET 临时文件夹中将生成该应用程序的两个 DLL 文件。
要让该应用程序与 SqlTableProfileProvider 一同使用,我将新建一个名为 CustomProfile 的表格,该表格中包含了多列以存储用户的姓名、地址全称、电话号码和一个用于确定用户配置文件当前版本的版本号。表格的最后一列还含有作为主关键字的用户的唯一标识符和最近更新的日期。例如,图 3 显示了如何将提供程序添加到配置文件分区。另外您还可以从中发现如何将每个属性添加到属性分区组中。除了 .NET 类型和默认值以外,您还需要在每个属性上指定一个自定义提供程序数据属性。该属性将包含 SQL 表格的列名称和该列的 SQL 类型。