注:本解决办法应用于论坛不是安装根目录的情况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 xmlns

sd="
http://www.w3.org/2001/XMLSchema" xmlns

si="
http://www.w3.org/2001/XMLSchema-instance">
和
</ArrayOfBaseConfigInfo>
这两句代码去掉,然后再浏览,呵呵,世界清净了。
相信雪人老大加上面两句代码是为了满足一个站点多个论坛的情况,这个对一个站点一个论坛的站长来说没什么作用,暂时去掉,能用是正道,希望雪人老大可以解决这个问题。
上面只是个人测试,如果还有问题那就继续给雪人老大拍砖,让他赶紧解决我们的燃眉之急。