2sxc v14升级至v16报错:ZoneIdOfApp(-100)异常批量解决咨询
2sxc v14.11.00 升级至 v16.07.00 后特定应用实例导致DNN页面崩溃的批量修复方案
问题背景
在DNN Evoq Basic(v9.11.0)环境中,将2sxc从v14.11.00升级到v16.07.00后,多数自定义应用升级正常,但某款新开发应用的现有实例会导致所在DNN页面完全崩溃。
报错信息
DNN管理日志报错如下:
AbsoluteURL:/Default.aspx DefaultDataProvider:DotNetNuke.Data.SqlDataProvider, DotNetNuke ExceptionGUID:5ca78c40-c1bd-47dc-8ee9-fa25cea13519 AssemblyVersion:9.11.0 PortalId:0 UserId:-1 TabId:840 UserAgent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 ExceptionHash:cHcp53K7qlaX48ozZlBrNSATb7A= Message:Error trying to run ZoneIdOfApp(-100) - probably something wrong with the appId StackTrace: InnerMessage:Error trying to run ZoneIdOfApp(-100) - probably something wrong with the appId InnerStackTrace: at ToSic.Eav.Caching.AppsCacheBase.ZoneIdOfApp(Int32 appId, IAppLoaderTools tools) in C:\Projects\2sxc\eav-server\ToSic.Eav.Core\Caching\Apps\AppsCacheBase.cs:line 192 at ToSic.Eav.Apps.AppStates.IdentityOfApp(Int32 appId) in C:\Projects\2sxc\eav-server\ToSic.Eav.Core\Apps\AppStates.cs:line 35 at ToSic.Eav.Persistence.Efc.Efc11Loader.LoadBasicAppState(Int32 appId) in C:\Projects\2sxc\eav-server\ToSic.Eav.Persistence.Efc\Efc11Loader_App.cs:line 35 at ToSic.Eav.Persistence.Efc.Efc11Loader.AppState(Int32 appId, Boolean ensureInitialized) in C:\Projects\2sxc\eav-server\ToSic.Eav.Persistence.Efc\Efc11Loader_App.cs:line 98 at ToSic.Eav.Caching.AppsCacheBase.GetOrBuild(IAppLoaderTools tools, IAppIdentity appIdentity, String primaryLanguage) in C:\Projects\2sxc\eav-server\ToSic.Eav.Core\Caching\Apps\AppsCacheBase.cs:line 139 at ToSic.Lib.Helpers.GetOnce`1.Get(Func`1 generator) in C:\Projects\2sxc\eav-server\ToSic.Lib.Core\Helpers\GetOnce.cs:line 37 at ToSic.Sxc.Web.LightSpeed.LightSpeed.ExistingGenerator() in C:\Projects\2sxc\2sxc\Src\Sxc\ToSic.Sxc\Web\LightSpeed\LightSpeed.cs:line 182 at ToSic.Lib.Helpers.GetOnce`1.Get(Func`1 generator) in C:\Projects\2sxc\eav-server\ToSic.Lib.Core\Helpers\GetOnce.cs:line 37 at ToSic.Sxc.Dnn.View.<>c__DisplayClass16_0.<Page_PreRender>b__1() in C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn\View.ascx.cs:line 0 at ToSic.Lib.Logging.LogCallBaseExtensions.DoInTimer(ILogCall logCall, Action action) in C:\Projects\2sxc\eav-server\ToSic.Lib.Core\Logging\LogCall\LogCallBaseExtensions.cs:line 15 at ToSic.Sxc.Dnn.View.<Page_PreRender>b__16_0() in C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn\View.ascx.cs:line 116 at ToSic.Lib.Logging.ILog_Actions.Do(ILog log, String parameters, Action action, Boolean timer, Boolean enabled, String message, String cPath, String cName, Int32 cLine) in C:\Projects\2sxc\eav-server\ToSic.Lib.Core\Logging\Log\ILog_Actions.cs:line 64 at ToSic.Sxc.Dnn.View.Page_PreRender(Object sender, EventArgs e) in C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn\View.ascx.cs:line 113 at System.Web.UI.Control.OnPreRender(EventArgs e) at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
临时解决方案
删除页面上的该应用实例并重新添加,页面即可恢复正常,但生产环境中有大量该应用实例,需避免手动逐个修复。
批量修复方案
1. 批量更新模块的AppID配置
报错提示ZoneIdOfApp(-100),说明模块实例存储的AppID为无效值(-100是临时未初始化标识)。可通过SQL脚本批量修正:
- 先获取目标应用的正确AppID:在2sxc应用管理界面找到该应用,从详情URL(如
/DesktopModules/2sxc/Apps/Edit.aspx?AppId=XXX)中提取有效AppID - 执行以下SQL脚本(替换占位符):
-- 备份数据库后执行 UPDATE dbo.TabModules SET ModuleSettings = REPLACE(ModuleSettings, '"AppId":-100', '"AppId":123') -- 123替换为正确的AppID WHERE ModuleSettings LIKE '%YourCustomAppName%' -- YourCustomAppName替换为目标应用的名称
2. 清除2sxc缓存
升级后残留的缓存可能导致旧数据关联异常,执行以下操作:
- 登录DNN后台,进入2sxc > 系统管理 > 清除缓存
- 或手动删除DNN站点根目录下
Portals/_default/2sxc/Cache内的所有文件
3. 用DNN API批量修复模块实例
如果SQL脚本无法覆盖所有情况,可编写C#脚本通过DNN API批量修正:
var moduleController = new DotNetNuke.Entities.Modules.ModuleController(); // 获取所有2sxc模块实例 var all2sxcModules = moduleController.GetModulesByDefinition("2sxc"); foreach (var module in all2sxcModules) { if (module.ModuleSettings.ContainsKey("AppId") && module.ModuleSettings["AppId"].ToString() == "-100") { // 设置正确的AppID module.ModuleSettings["AppId"] = "123"; // 替换为实际AppID moduleController.UpdateModule(module); } }
可将此代码封装为DNN自定义工具或在DNN后台的代码执行工具中运行(需管理员权限)
4. 升级前预处理(未升级生产环境时可用)
若尚未执行生产升级,可提前批量重新保存该应用的所有模块实例,确保AppID正确存储,避免升级后出现无效值。
内容的提问来源于stack exchange,提问作者Zachary
相关产品推荐
相关产品推荐

