新安装DNN/2sxc环境下索引器报错:字典中不存在给定键
解决DNN/2sxc索引触发的"The given key was not present in the dictionary."异常
嘿,我之前也碰到过类似的2sxc索引报错,结合你给出的错误堆栈(指向DnnBusinessController.GetModifiedSearchDocuments第89行),这个问题基本是索引过程中2sxc尝试访问一个不存在的字典键导致的,大概率和模块内容配置、索引缓存或者版本兼容有关,给你几个实用的排查解决步骤:
1. 先检查出问题的模块(ID 458)
- 登录DNN后台,找到标签页ID 50上的那个2sxc模块(ID 458)
- 进入模块的内容管理界面,逐个检查所有内容项:
- 有没有内容项缺失必填字段?比如某个关键字段被意外清空或删除了
- 有没有内容项关联了已经被删除的实体(比如关联的分类、其他内容项)
- 试着把所有内容项重新保存一遍,确保每个项的字段都完整有效
2. 清理并重建DNN搜索索引
有时候损坏的索引缓存会触发这类奇怪的错误:
- 进入DNN后台的设置 > 搜索页面
- 先点击清除索引,等清理完成后再点击重建索引,全程留意是否还会抛出相同的异常
3. 确认2sxc和DNN的版本兼容性
- 查一下你用的2sxc版本和当前DNN版本是否匹配(比如DNN 7.x对应的2sxc版本有特定要求,跨版本很容易出问题)
- 如果版本不兼容,赶紧升级/降级2sxc到官方推荐的对应版本
4. 自定义代码的排查(如果有修改过2sxc相关代码)
如果你项目里有自定义的2sxc扩展,或者修改过DnnBusinessController的逻辑:
- 打开
DnnBusinessController.cs跳到第89行,看看代码里访问字典的部分 - 一定要在访问字典键之前先做存在性检查,比如改成这样:
if (targetDictionary.ContainsKey(targetKey)) { var value = targetDictionary[targetKey]; // 后续处理逻辑 } else { // 可以加个日志记录,或者返回默认值避免崩溃 } - 重新编译部署修改后的代码
5. 检查模块权限和数据库数据
- 确保执行索引的Host账号拥有模块458的完整权限,包括内容的读取权限
- 可以去数据库里看看
ToSIC_SexyContent_Content这类表,有没有和模块458相关的损坏或异常记录
要是以上步骤都没解决,建议先导出模块458的内容,删除模块后重新创建再导入内容,最后再重建索引试试。
内容的提问来源于stack exchange,提问作者Frédéric Laurent
相关产品推荐
相关产品推荐

