一、介绍
ASP.NET Web应用程序用一种内置的方法访问简单的“键/值”配置数据。在Web.config文件中,你可以创建节来存储简单的“键/值”对。例如,新建一个ASP.NET项目,在Web.config文件中添加如下的标记作为元素的子标记:
该节包含了用两个标记定义的“键/值”对,你可以通过Page对象内置的ConfigurationSettings属性获得它们的值。作为开始,在你的项目中新建一个名为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 编译运行customItems.aspx Web窗体,就能看到标记的值了。For循环检索了节中所有的标记,并将键及其对应的属性值显示出来。这种简单的“键/值”机制对于许多一般性需求来讲是完美的,比如在整个应用范围内存储数据库连接字符串,但对于更复杂的数据它却不是足够健壮。幸运的是,微软同样建立了创建自定义配置数据的机制,利用ASP.NET框架读取一个或多个节,而不是仅通过某一具体应用中的代码去读固定的标记列表。节定义了框架预期在Web.config文件其余部分发现的标记名称,同时声明了处理其特定类型内容的类的类型和位置。
![](/images/load.gif)
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的方法,该方法接受三个参数:一个名为parent的object变量,一个HttpConfigurationContext对象变量,一个名为section的XmlNode变量。 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) Next End If articles.Add(New Article(aTitle, aURL, authors)) Next Return articles End Function End Class Public Class Article Private m_title, m_url As String Private m_authors As ArrayList Public Sub New (ByVal aTitle As String, ByVal aURL As String, ByVal authors As ArrayList) m_title = aTitle m_url = aURL m_authors = authors End Sub Public ReadOnly Property Title() As String Get Return m_title End Get End Property Public ReadOnly Property URL() As String Get Return m_url End Get End Property Public ReadOnly Property Authors() As ArrayList Get Return m_authors End Get End Property End Class 四、使用自定义配置节处理程序 现在可以对CustomItemHandler类进行测试了。首先,确定代码编译无误。为了能够测试这个类,还需要增加一个标记以声明处理标记的自定义配置节处理程序。现在回到在文章开始时创建的ASP.NET项目中,添加引用之前编译CustomItemHandler项目所生成的CustomItemHandler.dll文件。具体操作是,在解决方案资源管理器窗口中右键单击“引用”并选择“添加引用”,在弹出窗口中选择“.NET”标签并单击“浏览”按钮,在CustomItemHandler项目中的bin子文件夹中可以找到该DLL文件。 接下来,对Web.config文件再做一次修改。在早先创建的标记中添加一个新的标记,设置name属性为“articlesVB”,设置type属性为之前创建的配置节处理程序的类名和程序集(assembly)名称(译者注:也就是相应类库dll文件的名称)。至此,节应该类似如下所示(版本号可能会有所不同): type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> type="CustomItemHandler.CustomTagHandler, CustomItemHandler"/> 警告:Web.config本身是XML文件,因此是区分大小写的!请确保属性值同标记、程序集(assembly)和类的名称都是匹配的。 把如下代码添加到customItems.aspx Web窗体中,以获取文章信息并将标题显示为超链接: Dim articles As ArrayList Dim anArticleVB As CustomItemHandler.Article Dim o as Object Dim s As String Response.Write(" ArticlesVB") articles = CType(System.Configuration. _ ConfigurationSettings.GetConfig _ ("articlesVB"), ArrayList) If Not articles Is Nothing Then For Each o In articles anArticleVB = CType(o, CustomItemHandler.Article) Response.Output.WriteLine _ (" """" & ">" & anArticleVB.Title & _ "")
If Not anArticleVB.Authors Is Nothing Then
s = "by "
For Each obj In anArticleVB.Authors
s += CType(obj, String) & ", "
Next
Response.Output.WriteLine _
(s.Substring(0, s.Length - 2))
End If
Next
End If
最后,编译并运行customItems.aspx Web窗体,可以看到尾随着一列文章信息的“ArticlesVB”标题(如图二所示),这些信息都是在Web.config文件的节中定义的。
![](/images/load.gif)