DNN详解(1)-Web.Config
多年以来,还是觉得DNN是一个非常出色的框架,非常实用的框架。
在熟悉Web.Config的过程中,我们可能会涉及很多其他方面的知识,不过大家可以去Google一下。
Web.Config在哪?
在解压文件包之后,安装DNN之前,Web.config的文件名叫release.config。运行前要修改文件名为Web.config,要修改里面的数据库连接串,并且一定要将该网站虚拟目录Asp.net的版本设置为2.0,否则有些Web.Config里面的东西解析不了。
第一次运行这个网站会自动执行安装动作,包括创建数据库中的相关对象(表/存储过程等)。最后程序会修改Web.config。有些变化:
<!--use as persistent cookie expiration. Value is in minutes, and only active if a non-zero figure-->
<addkey="InstallationDate"value="8/24/2007"/>
如何判断是不是第一次运行网站是不是要执行安装动作,其实并不是通过Web.Config中的设置来判断的,而是通过数据库中Version这个表中的记录来控制的,在Global.asax中实现的。
System.Web
在这个节里,最重要的就是httpModules和httpHandles。他们两个说白了就是:
l Handler用来处理某种路径下某种后缀名的文件请求。
l 而Modules就是一层一层的过滤器了,就是一个请求在服务器端要经过这些Module处理一下!
Modules的特点就是能够在请求的上行下行(指到Web核心处理)都能额外对请求进行处理,可以看到Modules包含了:
Compression 压缩和解压,通过配置去更改算法
RequestFilter对服务器端变量进行过滤,来决定页面跳转情况
UrlRewrite URL重写,这个是为了避免“变量?值”在URL中影响可读性及搜索引擎查找。
Exception 重载了HttpApplication.Error事件,形成自己对异常的处理方式。
UsersOnline 重载了HttpApplication.AuthorizeRequest事件,对在线的注册和匿名用户进行统计。
DNNMembership 获取认证的相关信息,并从数据库中加载个性化信息
Personalization个性化,主要是保存个人上下文在数据库中
ScriptModule 是一个外部函数来处理的
Handler就是针对不同的文件类型(Path)及请求(Verb)动作采用不同的处理方式。
例如:处理验证码,处理RSS,处理AJAX。处理RSS请求的设置如下:
<!-- This adds syndication support -->
<add verb="*" path="RSS.aspx" type="DotNetNuke.Services.Syndication.RssHandler, DotNetNuke"/>
关于Handle和Module参见http://www.cnblogs.com/PM_2004/archive/2004/07/30/28625.html
Providers
Provider是目前ASP.Net普遍采用的一种设计模式。可以方便实现不同的策略。
在web.Config的表现就基本上是如下套路:
<configSections>
<section name="SomeProvider" type="My.Provider.SomeProviderConfigurationSection, My.Provider" />
</configSections>
<SomeProvider defaultProvider="theProvider">
<providers>
<add name="theProvider" type="My.Pattern.Provider.theProvider, My.Provider" />
</providers>
</SomeProvider>
这一段包含了一些信息:如何处理<SomeProvider></SomeProvider>节的方法
SomeProviderConfigurationSection,因为你可能还要在<add></add>节中加入一些额外的参数。
theProvider是真正被实例化的处理具体请求的Provider。
在DNN的Web.Config中的<dotnetnuke></dotnetnuke>中都是这些Provider的栖身之所。这些provider节的处理方法在<configSections></configSections>中定义了。
其他的节
codeSubDirectories
<codeSubDirectories>
<add directoryName="sub-directory name"/>
</codeSubDirectories>
如果你有模块放在"App_Code的某一个子目录下,而且你不是用缺省的语言VB开发的比如C#,你应该在这里登记一下该目录。
v