• 首页
  • 小学语文
  • 中学语文
  • 中学英语
  • 免费论文
  • 教学随笔
  • 学生作文
  • 综合考试
  • 试题教案
  • 育儿话题
  • 教学资源
  • 编程技术
  • 博客
  • 在ASP.NET中创建自定义配置节(翻译)

    日期:2003-03-26  地址:  作者:

    一、介绍

    ASP.NET Web应用程序用一种内置的方法访问简单的“键/值”配置数据。在Web.config文件中,你可以创建节来存储简单的“键/值”对。例如,新建一个ASP.NET项目,在Web.config文件中添加如下的标记作为元素的子标记:

      

         

         

      

    该节包含了用两个标记定义的“键/值”对,你可以通过Page对象内置的ConfigurationSettings属性获得它们的值。作为开始,在你的项目中新建一个名为customItems.aspxWeb窗体,将下面的代码添加到该窗体的Page_Load事件中:

       Dim aKey As String

       Response.Write("

    AppSettings

    ")

       For Each aKey In ConfigurationSettings.AppSettings.Keys

          Response.Output.WriteLine(aKey & "=" & _

             ConfigurationSettings.AppSettings.Item(aKey))

       Next

        编译运行customItems.aspx Web窗体,就能看到标记的值了。For循环检索了节中所有的标记,并将键及其对应的属性值显示出来。这种简单的“键/值”机制对于许多一般性需求来讲是完美的,比如在整个应用范围内存储数据库连接字符串,但对于更复杂的数据它却不是足够健壮。幸运的是,微软同样建立了创建自定义配置数据的机制,利用ASP.NET框架读取一个或多个节,而不是仅通过某一具体应用中的代码去读固定的标记列表。节定义了框架预期在Web.config文件其余部分发现的标记名称,同时声明了处理其特定类型内容的类的类型和位置。

    在解析配置文件时,ASP.NET引擎通过读取元素的

    标记建立起一个可能的标记列表,其中每一个
    标记都包含了一个“name”和一个“type”,声明了在文件其余内容中预期的标记名称和相应的配置节处理程序。下面用一个小实验来演示一下整个工作过程。在项目中Web.comfig文件末尾的标记前边,添加一个新标记如下。

      

         

         

         

      

    保存Web.config文件并运行项目,将会得到一个“无法识别的配置节‘customItems’”的错误,这个错误的发生是由于没有声明标记的节处理程序所致。但是如果浏览整个Web.config文件,你不会看到有任何一个标记的配置节处理程序声明,这就带来了一个问题,这些配置节处理程序究竟是在哪儿声明的?(在读这篇文章的时候,如果你同时按照上述步骤进行了操作,那么请在继续下去之前将标记从Web.config文件中删掉。)

    事实上每一个Web应用程序都有两个配置文件:保存在系统文件夹下的根machine.config文件和在你应用程序根目录下的Web.config文件。你可以在操作系统文件夹下的Microsoft.NETFrameworkCONFIG文件夹里找到machine.config文件,其中对应于服务器上安装并被激活的.NET框架。machine.config文件中关于配置的设置适用于在服务器上的所有应用程序,除非被局部设置所重置。浏览整个machine.config文件,可以看到一个包含了一组

    标记的标记,这些
    标记声明了你能在Web.config文件中看到的那些默认标记的配置节处理程序。为了使这一过程更易于理解,可以更进一步将
    标记分组放在标记中,其中分别存放一组相关的节标记。

    我之所以引出machine.config文件,是因为有两种方法添加自定义标记:可以用任一种缺省的系统配置节处理程序来解析自定义标记内容,也可以创建你自己的配置节处理程序。

     

    二、使用系统配置节处理程序解析自定义标记

        1.元素中创建一个新的

    标记,如下:

           type="System.Configuration.NameValueSectionHandler,System, Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"

    />

    作者提醒:VersionPublicKeyToken的值可能和你的.NET框架版本不同,要在系统中找出正确的值只需从任一个已存在的

    元素中复制即可!

    2.将新建的标记放在Web.config文件中的结束标记之前进行测试,例如:

      

         

         

               key="SomeKey" value="SomeValue" />

         

      

    3.保存Web.config文件,将如下高亮部分代码增加到customItems.aspx Web窗体中的Page_Load事件中:

       Dim aKey As String

       Response.Write("

    AppSettings

    ")

       For Each aKey In ConfigurationSettings.AppSettings.Keys

          Response.Output.WriteLine(aKey & "=" & _

             ConfigurationSettings.AppSettings.Item(aKey))

       Next

       Response.Write("

    CustomSystemItems

    ")

       For Each aKey In CType(ConfigurationSettings.GetConfig _

          ("customSystemItems"), _

          System.Collections.Specialized.NameValueCollection).Keys

          Response.Output.WriteLine(aKey & "=" & _

             ConfigurationSettings.AppSettings.Item(aKey))

       Next

    4.现在再次编译执行该Web窗体。这次,可以看到CustomSystemItem头信息尾随了一行“SomeKey=SomeValue”,它对应着在元素中增加的一个子元素。

    通过修改machine.config文件,可以将定义好的自定义标记应用到在服务器上运行的任意Web应用程序上。但很可能你并不总是希望标记处理程序应用于所有应用程序,如果是这样,可以在Web.config文件中增加标记和

    标记,而不是在machine.config文件中。测试一下,首先删除之前在machine.config文件中定义的
    标记并保存,接着,在Web.config文件中紧跟着开始标记增加一个标记,并在其中置入
    标记。例如:

      

             

            

             type="System.Configuration.NameValueSectionHandler,

             System, Version=1.0.3300.0, Culture=neutral,

             PublicKeyToken=b77a5c561934e089"/>

         

         

      

    5.为了能够看到变化,在web.config文件中的节再附加一个标记。

      

         

         

               key="SomeKey" value="SomeValue" />

               key="AnotherKey" value="AnotherValue" />

         

      

    保存web.config文件并再次运行customItems.aspx Web窗体,可以看到有两个值而不再只是一个。无需重新编译应用程序即可完成测试,ASP.NET能够立即应用新的配置。

    使用这种方式可以定义任意数量的自定义标记。然而,使用普通的标记,以及“key”和“value”这种固定的属性名称,总显得不是特别直观。从可维护性方面考虑,创建可以同时控制标记和属性名称的自定义标记会更有效一些。

     

    三、定义解析自定义标记的自定义配置节处理程序

    假定需要定义一系列文章,每一篇都有一个标题,一个URL,没有或有多个作者,那么如下所示的标记结构就会比泛泛的更容易维护:

      

         

             url="http://www.somewhere.com/article1.aspx">

            

                Russell Jones

            

         

         

             url="http://www.somewhere.com/article2.aspx" />

            

                Russell Jones

                Barry Jones

            

         

      

    增加标记及其内容(即上边的XML段)到Web.config文件末尾的标记之前并保存。

    作者提醒:先不要运行这个项目,否则会因为还没有为节定义配置节处理程序而出错!

    为了能够从配置文件中识别标记,必须创建相应的自定义配置节处理程序。创建自定义配置节处理程序并不难,但需要一个单独的项目。这是因为配置节处理程序执行机制会根据程序的名称来搜索exe文件或dll文件。我将会带领大家用VB.NET来演示整个过程,而在本文源代码下载中也包括功能完全相同的C#项目(译者注:作者提供的本文相关源码下载地址是http://www.devx.com/assets/sourcecode/6600.zip)。

    新建一个类库项目并命名为CustomItemHandler,删除VS默认生成的类而在项目中添加一个名为CustomTagHandler的新类。自定义配置节处理程序必须实现IconfigurationSectionHandler接口,这个接口只有一个名为Create的方法,该方法接受三个参数:一个名为parentobject变量,一个HttpConfigurationContext对象变量,一个名为sectionXmlNode变量。

       Imports System

       Imports System.Collections

       Imports System.Xml

       Imports System.Configuration

      

       Public Class CustomTagHandler

          Implements IConfigurationSectionHandler

          Public Function Create(ByVal parent As Object, _

          ByVal configContext As Object, _

          ByVal section As System.Xml.XmlNode) As Object _

          Implements System.Configuration. _

          IConfigurationSectionHandler.Create

          ' Implementation here

       End Class

    ASP.NET框架读到节点时,将创建CustomTagHandler类的实例并调用它的Create方法。XmlNode参数包含了希望读取的所有设置——在本例中也就是自定义标记及其内容。在这三个参数中,通常只用到XmlNode参数,但考虑到完备性,parent对象保存了相应父配置节的配置设置,参数configContext——HttpConfigurationContext类的实例——则主要被用来获取Web.config文件的虚拟路径。

    你可以按照自己的意愿设置自定义配置节的内容,简单或复杂均可。我则选择一种比简单“键/值”对要复杂一些的例子,以展示使用XML格式配置文件的可行性。

    Create方法返回了一个Object对象,你可以决定你希望返回的对象类型,但因为这是在实现接口方法,所以不能改变方法的返回类型。也正因为此,调用自定义配置节处理程序的代码必需将返回对象转换成正确类型。

    CustomTagHandler类在读取标记中的

    子标记时,将一系列Article对象存入一个ArrayList中,每个Article对象有三个公共只读的属性,分别保存了对应文章的标题、URL和作者。注意因为每篇文章会有任意数量的作者,所以Article对象同样使用一个ArrayList来实现作者列表。必须认识到很重要的一点是,这里并不对数据做任何处理!只需简单地返回这些XML节点本身,然后让调用程序提取数据即可,你可以根据任何需要,例如将作者列表作为XML节点集返回。创建的自定义配置节处理程序的重点是能够让你在任何需要的时候提取数据进行处理。这里给出CustomTagHandler 类和 Article类的完整代码。

       Imports System

       Imports System.Collections

       Imports System.Xml

       Imports System.Configuration

      

       Public Class CustomTagHandler

          Implements IConfigurationSectionHandler

          Public Function Create(ByVal parent As Object, _

          ByVal configContext As Object, _

          ByVal section As System.Xml.XmlNode) As Object _

          Implements System.Configuration. _

          IConfigurationSectionHandler.Create

             Dim NArticle, NAuthor As XmlNode

             Dim articleNodes, authorNodes As XmlNodeList

             Dim authors As ArrayList

             Dim aTitle As String

             Dim aURL As String

             Dim articles As New ArrayList()

      

             articleNodes = section.SelectNodes("article")

             For Each NArticle In articleNodes

                aTitle = NArticle.Attributes.GetNamedItem("title").Value

                aURL = NArticle.Attributes.GetNamedItem("url").Value

                authors = New ArrayList()

                authorNodes = NArticle.SelectNodes("authors//author")

                If Not authorNodes Is Nothing Then

                   For Each NAuthor In authorNodes

                      authors.Add(NAuthor.InnerText)

    对 在ASP.NET中创建自定义配置节(翻译) 文章的评论    [查看网友评论]

    验证码:
    匿名发表: