因为Hosting Company发现我们的几个DNN站点受到Hacker的攻击(Portals目录下面出现类似这样的文件:1.asp;jpg help.asp;txt 如果懂IIS的朋友可能知道,当你访问这个假图形文件时,实际就在服务器上执行Hacker的asp程序了,那么ASP可以删掉你服务器上的文件,或者盗取你的文件,机密或者做更多破坏)
Hosting公司要求我们把多个站点升级到最新的DNN5版本。这几天花了很多时间做升级,也碰到很多问题,在这里希望把问题和解决办法列出了,希望对有类似问题的朋友有所帮助。
1.做好准备
DNN4中使用SKINS table来存储Portals和的Skins,Containers,Admin Skin,Admin Containers;DNN5改用PortalSettings table来存储;所以在SQLProvider 5.0.0升级时,程序会做相应转换。我出现的一个问题是在DNN4里面出现了重复数据,结果这一步转换出差,结果DNN5里面所有Portal的Skin都没了;检查方法是执行以下SQL:
select count(*),portalid,skinroot,skintype from skins group by portalid, skinroot, skintype
having count(*)>1
如果没有返回任何东西,OK,你可以继续,如果出现有Rows,你需要删掉重复数据,才能进行升级(特别是一个Installation多个站点的情况时)
2.XML出错
如果你升级后,碰到这样的问题:
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: BC30002: Type ‘Web.HttpResponse’ is not defined.
不要急,是因为你的站点用到XML模块,XML模块是用的源码版,而DNN5里面缺乏相关的引用说明,修改源码就能解决问题
找到App_Code\XML\Handlers 下的download.vb文件
修改第34行:
Private Sub RenderToResponseStream(ByVal Response As Web.HttpResponse, ByVal controller As XmlController)
成: Private Sub RenderToResponseStream(ByVal Response As System.Web.HttpResponse, ByVal controller As XmlController)
第89行:
Private Sub handleAuthenticateRequest(ByVal context As Web.HttpContext) To:
Private Sub handleAuthenticateRequest(ByVal context As System.Web.HttpContext)
3.HTML模块升级出错
我有两个站在升级后都出现HTML模块里面没有东西的情况,如果你到Event View里面看,会看到类似错误:
An error has occurred.
DotNetNuke.Services.Exceptions.ModuleLoadException: The type initializer for ‘DotNetNuke.Modules.Html.DataProvider’ threw an exception. —> System.TypeInitializationException: The type initializer for ‘DotNetNuke.Modules.Html.DataProvider’ threw an exception. —> System.InvalidCastException: Unable to cast object of type ‘DotNetNuke.Modules.HTML.SqlDataProvider’ to type ‘DotNetNuke.Modules.Html.DataProvider’. at DotNetNuke.Modules.Html.DataProvider.CreateProvider() — End of inner exception stack trace — at DotNetNuke.Modules.Html.HtmlTextController.GetTopHtmlText(Int32 ModuleID, Boolean IsPublished, Int32 WorkflowID) at DotNetNuke.Modules.Html.HtmlModule.get_ModuleActions() at DotNetNuke.UI.Modules.ModuleInstanceContext.LoadActions(HttpRequest Request) at DotNetNuke.UI.Modules.ModuleInstanceContext.get_Actions() at DotNetNuke.UI.Containers.ActionBase.Page_Load(Object sender, EventArgs e) — End of inner exception stack trace —
这个原因是在升级过程里面对老的HTML模块清理不干净造成的,DNN4的HTML模块使用的是源码,DNN5使用的是DLL;修复办法是首先确定DNN Extension里面已经安装了DNN5的HTML模块;然后
找到新的WebConfig里面
<codeSubDirectories>
<add directoryName="HTML" />
</codeSubDirectories>
删掉这个部分(这是DNN4使用的源码版HTML模块)
删掉
App_Code中的HTML目录
4.ModuleCache Provider安装出错
在几个Installation升级里面,有一次出现Module Cache安装不成功的情况,效果就是,安装后,用Admin或者Host登录OK,普通用户访问,一些模块没有内容;这是因为ModuleCache无法使用,DNN匿名访问时,大量使用Cache来提高访问速度,Cache没有安装,匿名用户就看不到内容了;以下办法可以帮你手动增加。
手动修改web.config,添加黄色部分:-
<section name="permissions" requirePermission="false" type="DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke" />
<section name="moduleCaching" requirePermission="false" type="DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke" />
<section name="outputCaching" requirePermission="false" type="DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke" />
and:-
<moduleCaching defaultProvider="FileModuleCachingProvider">
<providers>
<clear />
<add name="FileModuleCachingProvider" type="DotNetNuke.Services.ModuleCache.FileProvider, DotNetNuke.Provider.ModuleCaching.FileProvider" providerPath="~\Providers\ModuleCachingProviders\FileModuleCachingProvider\" />
<add name="MemoryModuleCachingProvider" type="DotNetNuke.Services.ModuleCache.MemoryProvider, DotNetNuke.Provider.ModuleCaching.MemoryProvider" providerPath="~\Providers\ModuleCachingProviders\MemoryModuleCachingProvider\" />
</providers>
</moduleCaching>
<outputCaching defaultProvider="MemoryOutputCachingProvider">
<providers>
<clear />
</providers>
</outputCaching>
</dotnetnuke>
确定这两个DLL在你的bin/Providers目录下面存在,如果没有你可以从别的站点Copy过来
总结
以上只是我们升级4个站点碰到的问题,很可能你升级时会碰到其它问题,总结一下你需要做的,升级并不可怕,而且有助于你了解DNN的结构。
- 做好Backup,升级前一定要做好文件和数据库备份,DNN5的升级不像平常小版本升级,升级过程中大量的修改了数据库结构和文件结构,一步出错,就可能完全无法返回,所以我们不能心存侥幸,做好Backup,就不怕升级不成功,网站无法恢复了
- DNN5升级时,需要比较大的Resource和Memory,所以Live站点升级有可能不成功,本地却比较容易成功;我的建议是先在本地升级,确认升级没有问题可以在Live站点直接升级(升级前确定没有其它人访问,确定所有目录可写);万一升级失败,你可以上传本地升级版本,或者恢复老版本,再重新试着升级
- 碰到问题不要怕,DNN在国外应用非常广泛,有很多类似我们升级中碰到问题的解决办法,如果你出现问题,最好的办法就是把出错信息直接Copy Paste到Google里面查询(千万不要用其它的像百度,搜搜之类的中文搜索)一般你都能查到不少类似问题的论坛,文章或者Blog;仔细阅读看看是不是能够帮助你解决
- 有些错误表面上看不到,你需要用Host登录,然后到Event View里面才能看到。记住查询时,尽量保持Copy一大段出差信息,如果太多搜索结果,你还可以加上DNN Upgrade的关键字,一起搜索。
- 如果你实在碰到很多特殊问题,或者大量使用了第三方模块,有可能自己完全无法解决,把Backup的文件和数据库Send给专业的DNN Service公司解决。(因为DNN改变了不少方法,有些模块在DNN5里面根本就没有了,所以还是有可能不修改源码就完全无法升级的站点,这时建议你寻找专业的公司,不要自己浪费时间了)