ASPNET2 提供程序的功能.docx
- 文档编号:17661011
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:35
- 大小:139.60KB
ASPNET2 提供程序的功能.docx
《ASPNET2 提供程序的功能.docx》由会员分享,可在线阅读,更多相关《ASPNET2 提供程序的功能.docx(35页珍藏版)》请在冰点文库上搜索。
ASPNET2提供程序的功能
30
第章
提供程序的功能
提供程序模型是ASP.NET2.0中普遍采用的一个新特性,它提供了更大的扩展性。
提供程序模型的概念并不是新东西,但它是第一次打包到基本的.NETFramework中。
过去,对于ASP.NET的各种服务,例如会话或高速缓存管理,在定制它们时,能插入解决方案的扩展点非常少。
ASP.NET小组在2.0版本中的一个主要焦点是提供更多的扩展点,让开发人员提供ASP.NET核心功能和特性的定制实现方式。
例如,考虑会话管理功能(在ASP.NET1.0中引入,为存储在进程、StateServer和SQLServer数据库中提供了支持,但没有提供定制它的功能,也没有特别的措施)。
在ASP.NET2.0中,会话管理功能可以被完全替代,我们可以提供自己的定制数据存储器,存储任意内容。
该功能并不仅限于会话存储,在ASP.NET2.0中还为成员、角色、配置和个性化等服务提供了几个新的提供程序。
它们都使用提供程序模型的概念,都是可完全扩展的。
另外,还可以使用提供程序模型的概念,为应用程序建立自己的即插即用服务。
在有不同的实现方式时,例如,一个人使用XML文件,另一个人使用SQLServer,这个技术尤其适用。
它还能用于独立的软件厂商(ISV)和建立由其他公司使用的应用程序的开发人员。
通过使用提供程序的概念,ISV允许其客户拥有类似的扩展点。
本章将探讨一些基本的扩展点,讨论如何使用提供程序模型创建基于提供程序的解决方案,让应用程序的终端用户或其他开发团队给基于提供程序模型的服务插入他们自己的实现方式。
3.1什么是提供程序模型
简单地说,提供程序模型的目标是提供一种方式,让应用程序定义一组方法,通过这些方法,可以让多个实现方式交互。
它还可以隐藏所使用的实现方式的应用程序知识。
应用程序不知道,通过配置文件选项是使用了SQLServer实现方式,而不是简单的XML文件。
那么,为什么不使用接口呢?
从技术上讲,使用接口可以为可用的方法和多个实现方式提供一个契约。
但使用接口,结构比较僵化,因为接口是所提供的方法和属性的一种不可撤消的契约。
提供程序模型的概念建立在继承ProviderBase类的基础之上,ProviderBase类是System.Configuration程序集的System.Configuration.Provider命名空间中的新类,它是一个抽象类,可以由提供程序的实现者继承。
这个类非常简单,只提供了几个在大多数提供程序中都有用的方法和属性。
表3-1列出了ProviderBase类的重要方法和属性。
表3-1
属性
说明
Name
返回提供程序的名称,从提供程序的配置项中提取
Description
提供程序的完整文本描述。
如果给出了一组提供程序,以供选择,这个属性就很有用
方法
说明
Initialize
用于初始化提供程序,需要给该方法传送提供程序的名称和NameValueCollection,以允许访问配置上指定的、与提供程序相关的特性
3.2ASP.NET2.0附带的提供程序
ASP.NET2.0附带的几个特性实现并利用了提供程序模型的概念。
大多数特性都实现了在数据库中提取和存储数据的功能。
例如,MembershipProvider类建立了用于管理用户的契约。
与其他几个提供程序一样,ASP.NET2.0附带的控件使用在应用程序中配置的MembershipProvider。
这些控件能工作的原因是,它们可以依赖已配置的提供程序,执行在MembershipProvider上定义的一组固定方法。
与ProviderBase一样,MembershipProvider类也是一个抽象类,仅为成员管理提供了契约或方法/属性定义。
为了使它可用,ASP.NET小组提供了SqlMembershipProvider,它继承自MembershipProvider,提供了MembershipProvider契约的具体实现方式。
在下面的例子中,ASP.NET使用web.config或machine.config中的配置信息,确定哪个MembershipProvider是激活的,以标识和加载相应的提供程序。
如果查看machine.config文件,搜索membership,就会找到MembershipProvider的默认配置。
下面的示例是MemberShipProvider的machine.config文件的默认内容:
type="System.Web.Security.SqlMembershipProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer"enablePasswordRetrieval="false" enablePasswordReset="true"requiresQuestionAndAnswer="true" applicationName="/"requiresUniqueEmail="false"passwordFormat="Hashed" maxInvalidPasswordAttempts="5"minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1"passwordAttemptWindow="10" passwordStrengthRegularExpression=""/> 这个配置项告诉ASP.NET有一个SqlMembershipProvider类,并把各种设置传送给提供程序,以控制提供程序的操作方式。 该例子的目的不是研究传送给提供程序的各个参数,而是揭密成员提供程序如何使用默认的安装。 这些参数都可以在应用程序的本地web.config文件中修改,MSDN文档提供了其可能设置的详细信息。 本章的后面将讨论在建立自己的提供程序时,如何访问这些设置。 在其他内置提供程序模型的machine.config文件中,也有类似的配置项,它们由ASP.NET中的特性支持。 表3-2列出了ASP.NET的内置提供程序模型的特性及其实现方式。 表3-2 提供程序的类型 说明 Membership 管理用户,在System.Web.Security命名空间中有两个提供程序: SqlMembershipProvider和ActiveDirectoryMembershipProvider Role 管理与用户相关的角色,在System.Web.Security命名空间中有三个内置的提供程序: AuthorizationStoreRoleProvider、SqlRoleProvider和WindowsTokenRoleProvider SiteMap 用于填充站点地图控件,只有一个内置的提供程序: System.Web.XmlSiteMapProvider SessionState 可以管理站点用户的会话状态——提供程序匹配和提供的功能类似于ASP.NET1.1。 但是,现在用户可以扩展它,或用自己的会话状态提供程序来替代它。 会话状态提供程序位于System.Web.SessionState命名空间中,InProcSessionStateStore、OutOfProcSessionStateStore和SqlSessionStateStore实现了会话状态提供程序 Profile System.Web.Profile.SqlProfileProvider提供了一种SQLServer实现方式,来存储用户配置项。 将来的配置提供程序可以把正常的数据库表映射为配置项 WebEvent Web事件提供程序可以扩展或发布Web事件,它位于System.Web.Management命名空间。 下面是内置的提供程序: EventLogWebEventProvider、SimpleMailWebEventProvider、TemplateMailWebEventProvider、SqlWebEventProvider、TraceWebEventProvider和WmiWebEventProvider WebPart Personalization 为Webpart保存位置和其他个性化选项,Webpart位于System.Web.UI.WebControls.WebParts命名空间,SqlPersonalizationProvider是其唯一的内置提供程序 ProtectedConfiguration 在应用程序配置文件中提供各个配置段的保护,有两个内置的提供程序: DPAPIProtectedConfigurationProvider和RSAProtectedConfigurationProvider 在开始讨论如何建立自己的提供程序,扩展内置的提供程序之前,先考虑一个比较常见的问题: 如何让应用程序不使用本地的SQLExpress实例? 在前面的MembershipProvider配置示例中,连接字符串LocalSqlServer有一项。 快速扫描machine.config文件,也可以看到其定义,如下所示: source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/> 注意,这会影响ASP.NET附带的提供程序的所有SQLServer实现方式,所以改变它,会改变使用SQLServer版本的所有提供程序,除非修改它们的配置段,指定另一个connectionStringName。 如果要指定另一个SQLServer实例,只需清除现有的连接,或删除它,再添加自己的连接,如下所示: Source=ctcdev2;InitialCatalog=MyDB;IntegratedSecurity=True” providerName="System.Data.SqlClient"/> 要完成的另一个工作是对已有的数据库使用内置的提供程序。 在.NETFramework2.0的安装目录中有一个实用程序aspnet_regsql.exe,它会建立必要的数据库表和存储过程,来支持所有提供程序的内置SQL版本。 3.3扩展内置的提供程序 要扩展提供程序,最简单的一种方法是继承一个内置的实现方式,例如SqlMembershipProvider。 这么做有几个原因,但这里要演示的原因是限制用户登录的时间。 为此,我们将继承一个内置提供程序,重写ValidateUser方法,来实现时间限制功能。 3.3.1继承SqlMembershipProvider 首先,创建一个类,使它继承已有的SqlMembershipProvider。 下面的代码示例演示了该过程: namespaceMVPHacks.Security { /// ///SummarydescriptionforMVPHacksSQLMembershipProvider /// publicclassMVPHacksSQLMembershipProvider: System.Web.Security.SqlMembershipProvider { publicMVPHacksSQLMembershipProvider() { } } } 3.3.2配置新的提供程序 之后,就可以修改web.config文件,让应用程序使用新建的提供程序。 为了使该提供程序的操作类似于内置提供程序,可以编辑web.config文件,如下所示: connectionStringName="LocalSqlServer" type="MVPHacks.Security.MVPHacksSqlMembershipProvider"/> 如果把定制类放在app_code文件夹中,在引用程序集时,就需要对程序集的名称使用下面的语法: type="MVPHacks.Security.MVPHacksSqlMembershipProvider,app_code"/> 注意,app_code添加到完全限定的类名后面。 这样,在运行网站时,提供程序就可以随时从app_code程序集中实例化类型。 如果把类放在一般的程序集中,就将添加该程序集的名称,例如namespace.classname,mycommoncode。 3.3.3检查提供程序的配置 现在可以对应用程序进行快速测试,确保不出问题。 另外,如果打开WebSiteAdministrationTool(选择VisualStudio2005WebSite菜单,再选择ASP.NETConfiguration选项),进入Provider选项卡,就会发现,新建的提供程序现在已经是一个可选的成员提供程序,如图3-1所示。 图3-1 3.3.4重写ValidateUser 在用户尝试登录时,Login控件会调用ValidateUser方法。 我们需要进行检查,确定登录是否在工作时间进行,如果是,就允许登录: publicoverrideboolValidateUser(stringusername,stringpassword) { if((DateTime.Now.Hour>18)||(DateTime.Now.Hour<6)) returnfalse; returnbase.ValidateUser(username,password); } 在上面的例子中,达到了限制用户登录的时间的目的,但对控制该时间没有提供什么灵活性。 可以只使用appSettings,而提供程序的另一个可用选项是重写Initialize方法。 调用Initialize方法时,要把NameValueCollection传送给成员提供程序的add语句中的所有特性。 下面的例子包含在提供程序中截取的Start和End时间: name="MVPHacksMembershipProvider" NoLoginStartHour="2"NoLoginEndHour="10" type="MVPHacks.Security.MVPHacksSqlMembershipProvider, MVPHacksCommon"/> 下一步是重写Initialize方法,确定Start和End时间值: privateintm_StartHour=24; privateintm_EndHour=24; publicoverridevoidInitialize(stringname,NameValueCollection config) { if(config["NoLoginStartHour"]! =null) { m_StartHour= int.Parse(config["NoLoginStartHour"].ToString()); config.Remove("NoLoginStartHour"); } if(config["NoLoginEndHour"]! =null) { m_EndHour=int.Parse(config["NoLoginEndHour"].ToString()); config.Remove("NoLoginEndHour"); } base.Initialize(name,config); } 注意,在上面的例子中,调用base.Initialize方法之前删除了参数,因为如果给内置提供程序传送了它们不熟悉的特性,它们就会抛出异常。 在调用base.Initialize方法之前删除它们,可以在没有扩展定制的情况下利用配置属性。 而且,我们继承了已有的SQL提供程序,所以不需要再次执行其他逻辑。 下面的代码演示了修订后的方法,它使用从配置项中获得的值: publicoverrideboolValidateUser(stringusername,stringpassword) { if((DateTime.Now.Hour>=m_StartHour)&&(DateTime.Now.Hour<= m_EndHour)) returnfalse; returnbase.ValidateUser(username,password); } 这是一个相当简单的例子,但说明了如何利用内置提供程序来满足应用程序需要的附加业务要求,同时不需要重新实现已提供的全部功能。 3.4建立自己的成员提供程序 内置提供程序的一个选项是,实现一个定制类,来履行提供程序的契约。 这么做的一个常见原因是,要控制提供程序数据的存储。 例如,成员提供程序默认为ASP.NET成员服务的一个接口,它把数据存储在数据库的专用ASP.NET表中。 许多已有的应用程序都有成员表的概念,而替换它们来利用某些使用成员提供程序的内置控件,其工作量很大。 但是,创建一个执行MembershipProvider类的重要方法的类,就可以让定制类对已有的数据库执行成员操作。 这类定制并不限于对数据库执行操作,还可以从定制类中调用第三方供应商的API。 在上一个例子中,首先从SqlMembershipProvider中继承,重写ValidateUser方法,插入一些自己的逻辑。 我们使用已有的特性,在SQLServer数据库中存储数据。 在下面的例子中,要从头开始,只使用MembershipProvider类提供的契约。 因此,应继承MembershipProvider,而不是SqlMembershipProvider: namespaceMVPHacks.Security { /// ///SummarydescriptionforMVPHacksCustomMembershipProvider /// publicclassMVPHacksCustomMembershipProvider: System.Web.Security.MembershipProvider { publicMVPHacksCustomMembershipProvider() { } } } 注意: 如果在公共类库中创建自己的类,就要小心了;在默认情况下,类添加到项目中时,类声明中并不指定public。 因此该类是私有的,不能在类库的外部访问。 在Web项目或web.config中引用或使用该类时,可能找不到刚才创建的类。 VisualStudio2005的一个特性是,很容易为抽象类或接口创建实现代码的框架。 如图3-2所示,单击被继承的类或命名空间中第一个字母下面的短线,就会打开一个下拉列表,从中可以选择让VisualStudio2005创建实现代码的框架。 图3-2 对成员提供程序执行了上述操作后,类中标记为abstract(C#)或MustInherit(VB.NET)的属性或方法就会出现在文件中,还有一行代码将抛出异常,表示“没有执行方法或操作”。 这是很有帮助的,因为这样就不必查看文档说明,找出必须实现或已在类中定义的方法了。 另外,在提供程序中,也可以不执行所有的方法,而仅抛出一个NotSupportedException异常,告诉调用者,激活的提供程序不支持该属性或方法。 下面是选择implement选项时,VisualStudio2005生成的部分输出: publicclassMVPHacksCustomMembershipProvider : System.Web.Security.MembershipProvider { publicoverridestringApplicationName { get{thrownewException("Themethodoroperationisnot implemented.");} set{thrownewException("Themethodoroperationisnot implemented.");} } publicoverrideboolChangePassword(stringusername, stringoldPassword,stringnewPassword) { thrownewException("Themethodoroperationisnot implemented."); } } 在自己的范例中尝试一下,会看到所有的方法和属性,这里为了简洁起见,删减了结果。 可以把没有执行的方法从抛出一般异常改为抛出NotSupportedException异常。 这样,使用该实现方式的用户在运行期间检查是否执行了某个方法时,就会有一致、清晰的方式。 修改之前: publicoverrideboolChangePassword(stringuserna
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASPNET2 提供程序的功能 提供 程序 功能