ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

ASP.NET 档案特征允许你简化对于不同的提供者的使用。你既可以使用 .NET Framework 中的 SqlProfileProvider 类也可以实现属于你自己的提供者。

你应该在下列情况下才创建一个自定义的档案提供者:

  • 你需要把档案信息存储到一个数据源中(比如一个 FoxPro 数据库或者一个 Oracle 数据库),因为这些数据源并没有通过 .NET Framework 中所包括的档案提供者而被支持。
  • 你需要使用一个不同的数据库结构(不同于通过被包括在 .NET Framework 中的提供者而被使用的数据库结构)来管理档案信息。一个公共的范例就是你需要使用与 SQL Server 数据库中的现有用户数据相集成的档案信息。

必需的类

要实现一个档案提供者,你首先需要创建抽象类 System.Web.Profile.ProfileProvider 的一个继承类。而 ProfileProvider 抽象类则继承自 System.Configuration.SettingsProvider 抽象类(继承自 System.Configuration.Provider.ProviderBase 抽象类)。由于有了这个继承链,因此除了 ProfileProvider 类的必需成员之外,你还必须实现 SettingsProvider 类与 ProviderBase 类中的必需成员。

下表描述了你必须从 ProviderBase、SettingsProvider,以及 ProfileProvider 抽象类中实现的属性与方法。如果要回顾每个成员的实例,可以参考:[实践:建立并且运行档案提供者的范例]。

ProviderBase 的成员
成员描述
Initialize 方法以提供者实例的名称以及一个配置设定的 NameValueCollection 来作为输入。可以用来设置提供者实例的选项与属性值,包括特定的实例值以及在机器配置中或者 Web.config 文件中被指定的选项。
SettingsProvider 的成员
成员描述
ApplicationName 属性应用程序名称与每个档案被存储在一起。档案提供者可以使用应用程序名称来分别为每个应用程序而存储档案信息。这允许在多个 ASP.NET 应用程序在不同的应用程序中创建相同的用户名称而出现冲突的时候仍然能够使用相同的数据源。作为选择,多个 ASP.NET 应用程序还可以通过指定相同的应用程序名称来共享同一个档案数据源。
GetPropertyValues 方法以一个 SettingsContext 对象与一个 SettingsPropertyCollection 对象来作为输入。

SettingsContext 提供了与用户相关的信息。你可以把这些信息当成主关键字来获取用户的档案属性信息。使用 SettingsContext 对象还可以获取用户名称并且了解到用户是否已经被识别或者还是匿名用户。

SettingsPropertyCollection 包含了 SettingsProperty 对象的一个集合。并且每个 SettingsProperty 对象都提供了属性的名称,类型以及其他的额外信息(比如属性的默认值以及属性是否是只读的)。GetPropertyValues 方法还会使用基于作为输入而被提供的 SettingsProperty 对象的 SettingsPropertyValue 对象集合来组装一个 SettingsPropertyValueCollection。另外,数据源中被指定的用户值还会被指派到每个 SettingsPropertyValue 对象 PropertyValue 属性中并且返回整个集合。

调用这个方法同样会把被指定用户档案中的 LastActivityDate 属性值更新成当前日期与时间。

SetPropertyValues 方法以一个 SettingsContext 对象与一个 SettingsPropertyValueCollection 对象来作为输入。

SettingsContext 提供了与用户相关的信息。你可以把这些信息当成主关键字来获取用户的档案属性信息。使用 SettingsContext 对象还可以获取用户名称并且了解到用户是否已经被识别或者还是匿名用户。

SettingsPropertyValueCollection 包含了 SettingsPropertyValue 对象的一个集合。并且每个 SettingsPropertyValue 对象都提供了属性的名称、类型,值以及其他的附加信息(比如属性的默认值以及属性是否是只读的)。另外,SetpropertyValues 方法还会更新数据源中被指定用户的档案属性值。

调用这个方法同样会把被指定用户档案中的 LastActivityDate 属性值与 LastUpdatedDate 属性值更新成当前日期与时间。

ProfileProvider 的成员
成员描述
DeleteProfiles 方法以用户名称的一个字符串数组来作为输入,并且从数据源中删除被指定用户的所有档案信息与属性值,如果应用程序名称与 ApplicationName 属性值相匹配的话。

如果你的数据源支持事务处理,那么建议你把所有的删除操作都包括进一个事务处理中,并且在任何一种删除操作失败的时候还要对事务处理进行回退并且抛出一个异常。

DeleteProfiles 方法以 ProfileInfo 对象的一个集合来作为输入,并且从数据源中删除每个档案中的所有档案信息与属性值,如果应用程序名称与 ApplicationName 属性值相匹配的话。

如果你的数据源支持事务处理,那么建议你把所有的删除操作都包括进一个事务处理中,并且在任何一种删除操作失败的时候还要对事务处理进行回退并且抛出一个异常。

DeleteInactiveProfiles 方法以一个 ProfileAuthenticationOption 值和一个 DateTime 对象来作为输入,并且从数据源中删除所有档案信息以及属性值,如果最后的活跃日期小于或者等于被指定日期和时间并且应用程序名称与 ApplicationName 属性值相匹配的话。ProfileAuthenticationOption 参数还指定了是否只有匿名档案、还是只有已识别的档案,或者是所有的档案都会被删除。

如果你的数据源支持事务处理,那么建议你把所有的删除操作都包括进一个事务处理中,并且在任何一种删除操作失败的时候还要对事务处理进行回退并且抛出一个异常。

GetAllProfiles 方法以一个 ProfileAuthenticationOption 值、一个指定分页索引的整数、一个指定分页尺寸的整数,以及一个将被设置成档案总数的整数引用来作为参数。并且返回一个包含数据源中所有档案的 ProfileInfo 对象的 ProfileInfoCollection,如果应用程序名称与 ApplicationName 属性值相匹配的话。ProfileAuthenticationOption 参数还指定了是否只有匿名档案、还是只有已识别的档案,或者是所有的档案都会被返回。

通过 GetAllProfiles 方法而被返回的结果会通过分页索引的值与分页尺寸的值而被约束。分页尺寸值指定了在 ProfileInfoCollection 中被返回的 ProfileInfo 对象的总数上限。而分页索引值则指定了哪一个结果分页将要被返回,如果是 1 就表示是第 1 页。另外,总数记录的的参数还是一个输出参数(在 Visual Basic 中你可以使用 ByRef)。例如,如果数据存储包含了应用程序中的 13 个档案并且分页索引值是 2,分页尺寸是 5,那么被返回的 ProfileInfoCollection 中就会包含排在第 6 到第 10 的档案。并且总数记录值会在这个方法返回的时候被设置成 13。

GetAllInactiveProfiles 方法以一个 ProfileAuthenticationOption 值、一个 DateTime 对象、一个指定分页索引的整数、一个指定分页尺寸的整数,以及一个将被设置成档案总数的整数引用来作为输入。并且返回一个包含数据源中所有档案的 ProfileInfo 对象的 ProfileInfoCollection,如果最后的活跃日期小于或者等于被指定的 DateTime 并且应用程序名称与 ApplicationName 属性值相匹配的话。ProfileAuthenticationOption 参数还指定了是否只有匿名档案、还是只有已识别的档案,或者是所有的档案都会被返回。

通过 GetAllProfiles 方法而被返回的结果会通过分页索引的值与分页尺寸的值而被约束。分页尺寸值指定了在 ProfileInfoCollection 中被返回的 ProfileInfo 对象的总数上限。而分页索引值则指定了哪一个结果分页将要被返回,如果是 1 就表示是第 1 页。另外,总数记录的的参数还是一个输出参数(在 Visual Basic 中你可以使用 ByRef)。例如,如果数据存储包含了应用程序中的 13 个档案并且分页索引值是 2,分页尺寸是 5,那么被返回的 ProfileInfoCollection 中就会包含排在第 6 到第 10 的档案。并且总数记录值会在这个方法返回的时候被设置成 13。

FindProfilesByUserName 方法以一个 ProfileAuthenticationOption 值、一个包含用户名称的字符串、一个指定分页索引的整数、一个指定分页尺寸的整数,以及一个将被设置成档案总数的整数引用来作为输入。并且返回一个包含数据源中所有档案的 ProfileInfo 对象的 ProfileInfoCollection,如果用户名称与被指定的用户名称相匹配并且应用程序名称与 ApplicationName 属性值相匹配的话。ProfileAuthenticationOption 参数还指定了是否只有匿名档案、还是只有已识别的档案,或者是所有的档案都会被返回。

如果你的数据源支持额外的搜索能力(比如通配符),那么你还可以为用户名称提供更广泛的搜索能力。

通过 GetAllProfiles 方法而被返回的结果会通过分页索引的值与分页尺寸的值而被约束。分页尺寸值指定了在 ProfileInfoCollection 中被返回的 ProfileInfo 对象的总数上限。而分页索引值则指定了哪一个结果分页将要被返回,如果是 1 就表示是第 1 页。另外,总数记录的的参数还是一个输出参数(在 Visual Basic 中你可以使用 ByRef)。例如,如果数据存储包含了应用程序中的 13 个档案并且分页索引值是 2,分页尺寸是 5,那么被返回的 ProfileInfoCollection 中就会包含排在第 6 到第 10 的档案。并且总数记录值会在这个方法返回的时候被设置成 13。

FindInactiveProfilesByUserName 方法以一个 ProfileAuthenticationOption 值、一个包含用户名称的字符串、一个 DateTime 对象、一个指定分页索引的整数、一个指定分页尺寸的整数,以及一个将被设置成档案总数的整数引用来作为输入。并且返回一个包含数据源中所有档案的 ProfileInfo 对象的 ProfileInfoCollection,如果用户名称与被指定的用户名称相匹配、又如果最后的活跃日期小于或者等于被指定的 DateTime、并且如果应用程序名称与 ApplicationName 属性值相匹配的话。ProfileAuthenticationOption 参数还指定了是否只有匿名档案、还是只有已识别的档案,或者是所有的档案都会被返回。

如果你的数据源支持额外的搜索能力(比如通配符),那么你还可以为用户名称提供更广泛的搜索能力。

通过 GetAllProfiles 方法而被返回的结果会通过分页索引的值与分页尺寸的值而被约束。分页尺寸值指定了在 ProfileInfoCollection 中被返回的 ProfileInfo 对象的总数上限。而分页索引值则指定了哪一个结果分页将要被返回,如果是 1 就表示是第 1 页。另外,总数记录的的参数还是一个输出参数(在 Visual Basic 中你可以使用 ByRef)。例如,如果数据存储包含了应用程序中的 13 个档案并且分页索引值是 2,分页尺寸是 5,那么被返回的 ProfileInfoCollection 中就会包含排在第 6 到第 10 的档案。并且总数记录值会在这个方法返回的时候被设置成 13。

GetNumberOfInActiveProfiles 方法以一个 ProfileAuthenticationOption 值与一个 DateTime 对象来作为输入,并且返回数据源中的所有档案计数,如果最后的活跃日期小于或者等于被指定的 DateTime 并且应用程序名称与 ApplicationName 属性值相匹配的话。ProfileAuthenticationOption 参数还指定了是否只有匿名档案、还是只有已识别的档案,或者是所有的档案都会被计算在内。

ApplicationName

因为档案提供者会分别为每个应用程序而存储档案信息,所以你必须确保你的数据结构中包括了应用程序名称以及包括了应用程序名称的查询与更新。例如,下列命令被就被用来从数据库中获取一个基于用户名称的属性值并且了解到这个档案是否是匿名的,然后确保 ApplicationName 值已经被包括在这个查询中。

SELECT Property FROM PropertyTable 
  WHERE Username = 'user1' AND IsAnonymous = False 
  AND ApplicationName = 'MyApplication'
posted on 2007-02-15 18:10  Laeb  阅读(597)  评论(0编辑  收藏  举报