dottext分析之 XmlSerializerSectionHandler

先弄清aspnet的内部运行机制:
  remote client Request---->IIS---->aspnet_isapi.dll-->aspnet_wp.exe-->HttpRuntime---> HttpModule--->HttpHandler Factory--->HttpHandler--->HttpHandler.ProcessRequest()-->Response client Request

如果误将*.*交给iis处理而没做相应的进一步处理,可能会导致无法打开应用程序,提示的错误可能是“系统检测到不是aspnet1.1版本”。

dottext中的处理都是经过反射实现的。它自定义了很多section,相关的模块定义在一个section里,反射到同一个处理模块。这样就灵活的在用到时再加载相关类、对象。

首先看一下处理自定义配置节中反射的方法(XmlSerializerSectionHandler):

public class XmlSerializerSectionHandler : IConfigurationSectionHandler 
    
{
        
public object Create(object parent, object configContext, System.Xml.XmlNode section) 
        
{
            
//XPathNavigator 使用游标模型从所有数据存储区读取数据。
            
//CreateNavigator 创建 System.Xml.XPath.XPathNavigator 以浏览此对象。
            XPathNavigator nav = section.CreateNavigator();
            
//计算表示 XPath 表达式的字符串,并返回类型化结果(数字、布尔值、字符串或节点集)。使用 System.Xml.XPath.XPathNodeIterator 循环访问一组节点。  
            string typename = (string) nav.Evaluate("string(@type)"); 
            Type t 
= Type.GetType(typename);
            XmlSerializer ser 
= new XmlSerializer(t);//将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。System.Xml.Serialization.XmlSerializer 使您得以控制如何将对象编码到 XML 中。  
            
// XmlNodeReader:表示提供对 System.Xml.XmlNode 中 XML 数据进行快速、非缓存、只进访问的读取器。
            
//
            return ser.Deserialize(new XmlNodeReader(section));
        }


    }


XmlSerializerSectionHandler 继承了IConfigurationSectionHandler接口。继承并实现了它的方法create。
摘要:
 由所有配置节处理程序实现,以分析配置节的 XML。返回的对象被添加到配置集合中,并通过 System.Configuration.ConfigurationSettings.GetConfig(System.String) 访问。 

参数:
parent: 对应父配置节中的配置设置。
configContext: 在从 ASP.NET 配置系统中调用 System.Configuration.IConfigurationSectionHandler.Create(System.Object,System.Object,System.Xml.XmlNode) 时为 System.Web.Configuration.HttpConfigurationContext。否则,该参数是保留参数,并且为 null。
section: 一个 System.Xml.XmlNode,它包含配置文件中的配置信息。提供对配置节 XML 内容的直接访问。

返回值:
 配置对象。

举例应用:

<configSections>
        
<section name="BlogConfigurationSettings" type="Dottext.Framework.Util.XmlSerializerSectionHandler, Dottext.Framework" />
            
</configSections>
<BlogConfigurationSettings type="Dottext.Framework.Configuration.BlogConfigurationSettings, Dottext.Framework">
        
<Tracking enableAggBugs="true" enableWebStats="true" queueStats="false" queueStatsCount="3" enableTrackBacks="false" enablePingBacks="false" pingWeblogs="false" />
        
<EntryHandlers>
            
<EntryHandler type="Dottext.Framework.EntryHandling.CommentFormatHandler, Dottext.Framework" postType="Comment"    processAction="Insert" processState="PreCommit" isAsync="false" />
            
<EntryHandler type="Dottext.Framework.EntryHandling.CommentDeliveryHandler, Dottext.Framework"    postType="Comment" processAction="Insert" processState="PostCommit" isAsync="true" />
            
<EntryHandler type="Dottext.Framework.EntryHandling.EntryValidationHandler, Dottext.Framework"    postType="BlogPost Article" processAction="Insert Update" processState="PreCommit" isAsync="false" />
            
<!--<EntryHandler type="Dottext.Framework.EntryHandling.WeblogsPingHandler, Dottext.Framework" postType = "BlogPost" processAction ="Insert Update" processState="PostCommit" isAsync="true" />-->
            
<EntryHandler type="Dottext.Framework.EntryHandling.TrackBackHandler, Dottext.Framework" postType="BlogPost Article" processAction="Insert Update" processState="PostCommit" isAsync="false" />
            
<EntryHandler type="Dottext.Framework.EntryHandling.KeyWordHandler, Dottext.Framework" postType="BlogPost Article"    processAction="Insert Update" processState="PreCommit" isAsync="false" />
            
<!--<EntryHandler type="Dottext.Framework.EntryHandling.WebServicePostHandler, Dottext.Framework" postType = "BlogPost Article" processAction ="Insert" processState="PreCommit" isAsync="false" />-->
        
</EntryHandlers>
</BlogConfigurationSettings>
这段配置的意思就是如果要处理BlogConfigurationSettings配置节的话就交给XmlSerializerSectionHandler 处理,XmlSerializerSectionHandler 通过跌代循环处理BlogConfigurationSettings配置节中的所有type属性,将其反序列化成相应类的对象,将返回的对象添加到静态配置集合中。所以这里需要注意的是section 的name跟相关section的type中的类名称要一样,要不无法反序列化成相关对象了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章