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 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 内容的直接访问。
返回值:
配置对象。
举例应用:
<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>