您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz的NT代码阅读分析
代萱2025-06-26Discuz教程已有人查阅
导读Discuz是一个开源的ASP.NET论坛程序,我是从3.0就开始看他的代码的,较新版本是3.1.我拿到它的代码也有一段时间了,每天没事干就看看。以前没做过ASP.NET的东西,刚看见代码简直是一头露水。
Discuz是一个开源的ASP.NET论坛程序,我是从3.0就开始看他的代码的,较新版本是3.1.我拿到它的代码也有一段时间了,每天没事干就看看。以前没做过ASP.NET的东西,刚看见代码简直是一头露水。看了段时间,大概有些眉目了,于是乎,按老赵的说法:写出来,有收获。
比较菜鸟,有不对的地方或者语言组织不好没说清楚的还望各位达人多的指正.
一、从HttpModule开始:首页的显示
解压下载来的代码包,打开Discuz_vs08解决方案文件,可以看见这个解决方案有24个项目。之后生成网站输出的项目是Discuz.Web。展开这个项目,发现熟悉的index.aspx文件、两个config文件和几个文件夹。
双击index.aspx文件,发现里边只有这么短短的一行代码:
打开Web.Config文件,可以看见这样一段代码:
自己注册的httpModules由程序集Discuz.Forum中的类Discuz.Forum.HttpModul接管了Http请求。即:程序一开始运行,就会跳转到Discuz.Forum.HttpModul这个类中,在这个类中完成首页的显示和跳转。
关于HttpModule的介绍,可以看我在博客中转贴自张子阳的《Http请求处理流程》和《HttpModule介绍》这两篇文章介绍了程序为什么会跳转到Discuz.Forum.HttpModul类。
在项目Discuz.Forum中找到文件HttpModule.cs。可以看到HttpModule.cs中有一个叫HttpModule的类。这个类继承了接口System.Web.IHttpModule并实现了IHttpModule的Init和Dispose方法。
在Init方法中注册了函数ReUrl_BeginRequest事件用来处理Http请求:
找到ReUrl_BeginRequest方法。
在这个函数中,首先从配置文件config/general.config中读取论坛程序配置信息,如下:
收集了这些信息走后,在下边的代码将Http请求进行重定向:
显示论坛首页,否则,就跳转到website.aspx显示聚合首页。
HttpContext中的RewritePath指定了内部重写路径,RewritePath方将对资源的请求重新定向到其他资源,同时不会更改URL,因此我们看到的首页还是Index.aspx。
论坛其他页面的显示也可以通过跟踪ReUrl_BeginRequest函数来获取。
比较菜鸟,有不对的地方或者语言组织不好没说清楚的还望各位达人多的指正.
一、从HttpModule开始:首页的显示
解压下载来的代码包,打开Discuz_vs08解决方案文件,可以看见这个解决方案有24个项目。之后生成网站输出的项目是Discuz.Web。展开这个项目,发现熟悉的index.aspx文件、两个config文件和几个文件夹。
双击index.aspx文件,发现里边只有这么短短的一行代码:
<%@ Page %>
运行后,却发现首页有很多丰富的内容。其实这行代码什么都没做,删掉它,依然你能正常显示首页。为什么呢?看下边的分析。打开Web.Config文件,可以看见这样一段代码:
<httpModules>
<add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" />
</httpModules>
和:
<modules>
<!-- 注意:此节设置由Discuz!NT接管http请求。不会干涉对非Discuz!NT论坛路径下的请求。-->
<add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" />
</modules>
这里注册了httpModules这个东西,上边的代码在IIS6中有效,下边的在IIS7中有效。自己注册的httpModules由程序集Discuz.Forum中的类Discuz.Forum.HttpModul接管了Http请求。即:程序一开始运行,就会跳转到Discuz.Forum.HttpModul这个类中,在这个类中完成首页的显示和跳转。
关于HttpModule的介绍,可以看我在博客中转贴自张子阳的《Http请求处理流程》和《HttpModule介绍》这两篇文章介绍了程序为什么会跳转到Discuz.Forum.HttpModul类。
在项目Discuz.Forum中找到文件HttpModule.cs。可以看到HttpModule.cs中有一个叫HttpModule的类。这个类继承了接口System.Web.IHttpModule并实现了IHttpModule的Init和Dispose方法。
在Init方法中注册了函数ReUrl_BeginRequest事件用来处理Http请求:
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
注册这个事件之后,每次有Http请求,就会触发这个事件。找到ReUrl_BeginRequest方法。
在这个函数中,首先从配置文件config/general.config中读取论坛程序配置信息,如下:
GeneralConfigInfo config = GeneralConfigs.GetConfig();
之后通过对config中内容的判断,来完成论坛信息的初始化。如是否启用Url重写,是否使用伪aspx等等。收集了这些信息走后,在下边的代码将Http请求进行重定向:
if (requestPath.EndsWith("/index.aspx"))//如果是否首页的请求
{
if (config.Indexpage == 0) //是否显示聚合首页
{
if (config.BrowseCreateTemplate == 1)//模板不存在时是否自动生成
{
CreateTemplate(forumPath, Templates.GetTemplateItem(int.Parse(strTemplateid)).Directory, "forumindex.aspx", int.Parse(strTemplateid));
}
context.RewritePath(forumPath + "aspx/" + strTemplateid + "/forumindex.aspx");//显示论坛首页
}
else
{
if (config.BrowseCreateTemplate == 1)
{
CreateTemplate(forumPath, Templates.GetTemplateItem(int.Parse(strTemplateid)).Directory, "website.aspx", int.Parse(strTemplateid));
}
context.RewritePath(forumPath + "aspx/" + strTemplateid + "/website.aspx");//显示聚合首页
}
return;
}
config.Indexpage标识了论坛首页显示信息:显示聚合首页或者是论坛首页。如果显示论坛首页,就通过HttpContext的RewritePath跳转到aspx下strTemplateid目录中的forumindex.aspx。显示论坛首页,否则,就跳转到website.aspx显示聚合首页。
HttpContext中的RewritePath指定了内部重写路径,RewritePath方将对资源的请求重新定向到其他资源,同时不会更改URL,因此我们看到的首页还是Index.aspx。
论坛其他页面的显示也可以通过跟踪ReUrl_BeginRequest函数来获取。
本文标签:
很赞哦! ()
上一篇:discuz数据库表说明
下一篇:discuz缓存机制介绍
相关教程
- FolderPainter
- ContextMenuManager
- JavaScript数字的toExponential()方法
- JavaScript Number.parseInt()方法:将字符串解析为整数
- JavaScript Number.isInteger()方法:精确判断整数类型
- JavaScript Proxy的preventExtensions:对象锁定机制的精确保留
- JavaScript Map entries()方法
- JavaScript addEventListener
- Print Distributor
- Style2Paints
- JavaScript document.getElementsByTagName()
- document.getElementsByName()
图文教程
discuz数据库迁移改密码相关配置文件修改
网站系统需要修改的位置有两处 Discuz 和 UC-center①路径:/ root/config/config_global.php 这个根据你网站安装的路径而定。
discuz的MVC结构分析介绍
首先,我们先介绍一下MVC开发思想简介,MVC的全名是Model-View-Controller是模型-师徒-控制器的缩写,它是一种软件设计思想。使用一种业务逻辑、数据和显示分离的方法资质代码
kubernetes部署Discuz的步骤方法
本文将介绍在kubernetes环境中部署一套php应用系统。前端web采用nginx、中间件php以fastcgi的方式运行,后台数据库由mysql提供支撑。
discuz代码分析论坛入口文件
只是大致分析下执行流程,主要就是取得mod参数的值,根据取值加载控制器,控制器位置在之后一行指定了。1 )定义应用名称,加载两个必要文件
相关源码
-
(自适应html5)自媒体运营培训教程个人博客pbootcms模板本模板基于PbootCMS系统开发,特别适合自媒体运营培训、知识付费类网站使用。采用响应式设计,能够适配各类终端设备,为内容创作者提供专业的内容展示平台。查看源码 -
(自适应响应式)个人作品技术文章博客网站模板下载基于PbootCMS内核开发的响应式博客模板,为数字营销、技术分享类内容打造。采用前沿设计理念,兼顾内容展示与阅读体验,适配各类终端设备。通过本模板可快速构建专业级行业博客,有效传播专业知识与案例成果。查看源码 -
(PC+WAP)pbootcms模板黑色门窗定制五金建材网站下载为门窗定制与五金建材企业设计的网站解决方案,采用PbootCMS开发,兼具专业展示与营销功能。黑色系设计突显工业质感,响应式布局确保在手机、平板等设备上的浏览体验。通过简单的内容替换,也可适用于建材贸易、家具定制等相关行业。查看源码 -
(PC+WAP)绿色环保设备环保企业网站模板源码下载基于PbootCMS内核开发的响应式企业模板,为环保设备制造、环境技术服务等企业打造,通过模块化设计实现多行业快速适配。查看源码 -
(自适应)大气办公用品耗材供应打印机产品维修网站模板下载基于PbootCMS系统开发的响应式网站模板,为营销技术博主、数字产品评测者设计。采用前沿的响应式技术,确保内容在手机端和桌面端都能获得较佳阅读体验,帮助用户高效展示技术文章和产品分析。查看源码 -
(自适应)蓝色五金制品配件管件pbootcms网站源码下载基于PbootCMS内核开发的五金行业专用模板,采用响应式设计架构,确保产品展示在各类移动设备上的呈现。通过模块化布局与工业风视觉设计,帮助五金企业高效展示产品规格、应用场景及技术支持,建立专业可靠的行业形象。查看源码
| 分享笔记 (共有 篇笔记) |
