您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
解决Discuz论坛的Discuz.Cache.DNTCache 的AddObject()死循环
易烟2025-07-20Discuz教程已有人查阅
导读在前天,本人刚下了discuzNT的代码,研究了些许时间老是报stackoverflow的error在web.config中发现了这段代码:
在前天,本人刚下了discuzNT的代码,研究了些许时间老是报stackoverflow的error在web.config中发现了这段代码:
不排除是我的反编工具出的错,我的平台是win2003sp2+sqlserver2005EEsp2+vstssp1
<httpModules>
<add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule"/>
</httpModules>
呵呵,就是HttpModule类,好,找到HttpModule.cs,打开在Line48 有这么一句
if (Utils.InArray(Utils.GetCookie("dnttemplateid"), TemplateFactory.GetValidTemplateIDList()))
在执行TemplateFactory.GetValidTemplateIDList()的时候老实报错,就找到在打开发现在执行
cacheService.AddObject("/Forum/TemplateIDList", str);的时候还是报错
接着进去,这是他的具体的方法体
public virtual void AddObject(string xpath, string str)
{
lock (lockHelper)
{
if ((str != null) && (str != ""))
{
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
}
else
{
this.AddObject(xpath + "flag", CacheFlag.CacheNoData);
}
this.AddObject(xpath, str);
}
}
在情况对的时候,首先会进去
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
这时候调用的是
public virtual void AddObject(string xpath, object o)
这个方法,这个方法是没问题的,就是将一些数据插入Cache里面调用完成之后就执行的是
this.AddObject(xpath, str);(public virtual void AddObject(string xpath, string str)
)
大家注意,调用的是自身,是递归好,前面的if-else在执行一遍,回到this.AddObject(xpath, str);还是递归我就他的意思应该是首先插入路径,然后插入实际数据,两次缓存数据,但是实际代码就是这样子为了证明我的想法,我把代码加成这个样子
int i=0;
public virtual void AddObject(string xpath, string str)
{
i++;//计数功能
lock (lockHelper)
{
if ((str != null) && (str != ""))
{
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
}
else
{
this.AddObject(xpath + "flag", CacheFlag.CacheNoData);
}
this.AddObject(xpath, str);
}
}
再次运行,再次报错,一看i达到了2049,Cache给插入了2000多次,怪不得会overflow考虑了一下,改代码如下:
public virtual void AddObject(string xpath, string str)
{
lock (lockHelper)
{
if ((str != null) && (str != ""))
{
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
}
else
{
this.AddObject(xpath + "flag", CacheFlag.CacheNoData);
}
this.AddObject(xpath, (object)str);
}
}
在第二次的时候box一下,就直接进入public virtual void AddObject(string xpath, string str)里了这个DNTCache里好多这样的AddObject方法,都是这样的错误至此,运行暂时没问题了不知道大家遇到了这种情况没?不排除是我的反编工具出的错,我的平台是win2003sp2+sqlserver2005EEsp2+vstssp1
本文标签:
很赞哦! ()
图文教程
discuz中常用函数
js密码验证 install/js/setup.js将内容传送页面ajax注册(各页面通用ajax,js函数):register.aspxjs:emplates\default\ajax.js
discuz怎么添加广告位?discuz自定义广告位的方法
自定义广告位方法可以在页面的任意位置添加广告位,系统广告位位于 source/class/adv/ 目录中,插件广告位位于 source/plugin/插件目录/adv/ 目录中。
Discuz论坛自动发帖机实现方法
1. 起因:某人在自己的空间搭了个discuz,设置了诸多必须灌水的邪恶规定。本人一向潜水员当惯了当然不爽。a. discuz论坛无任何图片验证码,包括登陆以及发帖的时候。
Discuz解决安装时报错run_sql_error的方法
本文实现功能解决在MySQL8.0安装discuz报错run_sql_error如果想直接看解决结果,直接去看解决问题目录
相关源码
-
(自适应)幽默笑话脑筋急转弯搞笑趣图博客pbootcms模板下载本模板基于PbootCMS系统开发,专为幽默笑话、搞笑趣图类网站设计。采用轻松活泼的布局风格,突出娱乐内容分享特色,适合各类笑话、段子、搞笑图片等内容展示。查看源码 -
(自适应响应式)高端网站建设设计公司互联网营销网站pbootcms模板本模板基于PbootCMS内核开发,为网站建设公司和互联网营销企业量身打造。采用响应式设计,适配各种移动设备,提供统一的后台管理体验查看源码 -
(自适应)WordPress二次元博客主题SakurairoSakurairo主题为二次元内容创作者设计,提供丰富的动漫风格元素和个性化的展示效果。该主题在原有Sakura主题基础上进行了功能增强,支持多种自定义设置,满足动漫爱好者建立个人博客的需求。查看源码 -
(PC+WAP)蓝色不锈钢簧线金属制品营销型pbootcms网站模板本模板基于PbootCMS内核开发,为不锈钢及金属制品企业量身打造。采用响应式设计,适配PC与移动设备,提供统一后台管理体验,数据实时同步更新。查看源码 -
(自适应)帝国cms7.5模板新闻资讯门户带会员中心基于帝国CMS7.5内核开发的HTML5响应式模板,为新闻机构、媒体门户及资讯聚合平台设计。通过模块化布局实现图文混排查看源码 -
(自适应响应式)刷卡机POS机无线支付设备pbootcms网站源码下载本模板基于PbootCMS系统开发,为支付终端设备企业设计,特别适合POS机、移动支付终端、刷卡设备等金融科技产品展示。采用响应式布局技术,确保各类支付终端产品在不同设备查看源码
| 分享笔记 (共有 篇笔记) |
