Discuz!NT 2.5 beta下载测试
类库文档在线查看
Comsenz 招聘信息
首届Discuz!NT 模板大赛圆满结束
著名音乐网站SoGua网、分贝网
采用Discuz!NT搭建社区
FIFA Online2官网论坛使用Discuz!NT
游戏城寨论坛使用Discuz!NT搭建
要灌, 就灌有技术含量的水
一起交流学习ASP.net吧!
17套Discuz!NT界面模板提供下载
Discuz!NT后台截图先睹为快
Discuz!NT文档中心
用户整合说明文档
Discuz!NT亮相微软Tech-Ed 2007
Discuz!NT情景搞笑短片抢先看
1/1页1 跳转到查看:6566
发新话题 回复该主题

网站根目录下没有正确的DNT.config文件--本人的解决办法

网站根目录下没有正确的DNT.config文件--本人的解决办法

注:本解决办法应用于论坛不是安装根目录的情况
Discuz功能真的是so强大,也非常喜欢默认的皮肤,所以准备在网站中架设一个。

但是在配置论坛的过程中出现了"网站根目录下没有正确的DNT.config文件"的异常错误,实在是有点困惑(那个异常应该是读取配置文件DNT.config时处理出错,具体怎么出错,下面给你解释)但是论坛是按照帮助来安装怎么会出错呢?在论坛中搜索相关的帖子也看到有前者已经发现这个问题,却始终找不到解决的答案,雪人老大也不出来主持一下大局,只有自己找找原因了。

用Reflector反射出了论坛的源码,然后找到对应的Discuz.Forum.HttpModule(没错就是web.config中处理请求的拦截器)的类看到了相关的代码,然后在BaseConfigProvider类中找到了这个GetRealBaseConfig读取DNT.config的方法。
把这个方法的代码拷贝出来进行了一系列的调试,发现这个方法是有问题的。
把代码贴出来大家看看(雪人老大不要拿板砖拍我昂):

public static BaseConfigInfo GetRealBaseConfig()
{
    BaseConfigInfo info = null;
    string filename = null;
    HttpContext current = HttpContext.Current;
    if (current != null)
    {
        filename = current.Server.MapPath("/DNT.config");
    }
    else
    {
        filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DNT.config");
    }
    try
    {
        info = (BaseConfigInfo) SerializationHelper.Load(typeof(BaseConfigInfo), filename);
    }
    catch
    {
        info = null;
    }
    if (info == null)
    {
        try
        {
            BaseConfigInfoCollection infos = (BaseConfigInfoCollection) SerializationHelper.Load(typeof(BaseConfigInfoCollection), filename);
            foreach (BaseConfigInfo info2 in infos)
            {
                if (Utils.GetTrueForumPath() == info2.Forumpath)
                {
                    info = info2;
                    break;
                }
            }
            if (info == null)
            {
                BaseConfigInfo info3 = null;
                foreach (BaseConfigInfo info4 in infos)
                {
                    if (Utils.GetTrueForumPath().StartsWith(info4.Forumpath) && (info4.Forumpath != "/"))
                    {
                        info = info4;
                        break;
                    }
                    if ("/".Equals(info4.Forumpath))
                    {
                        info3 = info4;
                    }
                }
                if (info == null)
                {
                    info = info3;
                }
            }
        }
        catch
        {
            info = null;
        }
    }
    if (info == null)
    {
        throw new Exception("\u53d1\u751f\u9519\u8bef: \u7f51\u7ad9\u6839\u76ee\u5f55\u4e0b\u6ca1\u6709\u6b63\u786e\u7684DNT.config\u6587\u4ef6");
    }
    return info;
}


大家可以看到其中有这么一句代码
info = (BaseConfigInfo) SerializationHelper.Load(typeof(BaseConfigInfo), filename);
雪人老大的目的应该是想将DNT.config通过序列化和反序列化获得BaseConfigInfo类的一个实体,但是结果是Discuz.Forum.BaseConfigInfo类和论坛提供的DNT.config的结构是对应不起来的,所以这句话永远都取不到想要的结果,然后雪人老大又在下面继续判断,然而下面的代码又让人有点摸不着头脑,Utils.GetTrueForumPath()方法是返回的当前浏览路径,比如http://www.xxx.com/user/返回的是/user/,而用这个路径和论坛安装路径/bbs/去比较永远都不会返回真正想要的值,致使info一直为null,所以就出现了很多坛主在配置的时候出现的错误"第一次如果是直接浏览论坛目录会正常,但过一段时间就会出错的"(除非你第一次浏览的是http://www.xxx.com/bbs/这个目录)。
好,现在到了出解决办法的时候了,就是修改DNT.config(因为源码也没法修改:-)),将
<ArrayOfBaseConfigInfo xmlnssd="http://www.w3.org/2001/XMLSchema" xmlnssi="http://www.w3.org/2001/XMLSchema-instance">

</ArrayOfBaseConfigInfo>
这两句代码去掉,然后再浏览,呵呵,世界清净了。
相信雪人老大加上面两句代码是为了满足一个站点多个论坛的情况,这个对一个站点一个论坛的站长来说没什么作用,暂时去掉,能用是正道,希望雪人老大可以解决这个问题。

上面只是个人测试,如果还有问题那就继续给雪人老大拍砖,让他赶紧解决我们的燃眉之急。
站的更高,尿的更远www.yedushi.cn

TOP

 

回复: 网站根目录下没有正确的DNT.config文件--本人的解决办法

楼主这方法可以解决,谢谢

TOP

 

回复:网站根目录下没有正确的DNT.config文件--本人的解决办法

感谢楼主找到问题所在,后面这些代码是为了兼顾多论坛用户设计的,结果还是没有考虑周到。正式版打包的DNT.config好像是多论坛的配置。
默认应该是没有

<ArrayOfBaseConfigInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

</ArrayOfBaseConfigInfo>


才对
说出你对Discuz!NT的想法
MySQL版测试论坛暨Graffiti CMS中文论坛
feisibook  冠愉小传    图片故事

TOP

 

回复:网站根目录下没有正确的DNT.config文件--本人的解决办法

发现好多朋友都遇到了这个问题,就这个问题再给楼上的说几句吧:
我上面帖子中也分析了为什么会出现这样错误的原因,里面就提到了用路径来判断的情况,GetTrueForumPath()方法返回的是当前浏览的路径,用它去和配置的论坛路径做比较,有没有想过会有这样的情况:用户第一次浏览的路径与每一个论坛配置的路径都不相同?
呵呵,如果不相同还是会抛出异常的。
站的更高,尿的更远www.yedushi.cn

TOP

 

回复:网站根目录下没有正确的DNT.config文件--本人的解决办法

是这个原因吗?我试试再说了

TOP

 

回复:网站根目录下没有正确的DNT.config文件--本人的解决办法

楼主的方法可以解决部分问题
回归平凡http://www.lufei.org ……

TOP

 

回复:网站根目录下没有正确的DNT.config文件--本人的问题

2.0 的源码可能已经考虑到楼主所说的解决办法了,但运行时仍旧报错:The 'BaseConfigInfo' element is not declared.
查看 DNT.config 文件内容为
<BaseConfigInfo xmlnssd="http://www.w3.org/2001/XMLSchema" xmlnssi="http://www.w3.org/2001/XMLSchema-instance">
………………
</BaseConfigInfo>

所以用楼主所说的办法已经无法解决了 :(
急盼高手给出解决方案 :)

TOP

 

回复:网站根目录下没有正确的DNT.config文件--本人的解决办法

2.0下面这个方法没办法解决,怎么办呢

TOP

 

回复:网站根目录下没有正确的DNT.config文件--本人的解决办法

如果是 2003 sp2  的话。原因可能是因为c:\windows\temp 的权限不够。 discuz  不能写入文件。结果就会提示说文件不存在.

TOP

 
1/1页1 跳转到
发表新主题 回复该主题