先弄清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):
这段配置的意思就是如果要处理BlogConfigurationSettings配置节的话就交给XmlSerializerSectionHandler 处理,XmlSerializerSectionHandler 通过跌代循环处理BlogConfigurationSettings配置节中的所有type属性,将其反序列化成相应类的对象,将返回的对象添加到静态配置集合中。所以这里需要注意的是section 的name跟相关section的type中的类名称要一样,要不无法反序列化成相关对象了。
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));
}
}
{
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 >
< 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 >