1

我们在安装过程中遇到了一些非常奇怪的错误。有时,Sitecore 会突然抛出错误:

Assert: Value Cannot be null. Parameter: Item. 

我最接近确定问题的方法是将其缩小到索引或网络数据库。

无论如何,如果我登录到 sitecore,项目只是丢失了,我可以通过 3 种方式修复它:

  • 重建索引。
  • 回收应用程序池
  • iisreset

你们中有人知道为什么会发生这种情况吗?我们正在运行 Sitecore.NET 6.5.0(修订版 120706)。任何帮助将不胜感激。

4

2 回答 2

4

您描述的是系统稳定性问题,因此我建议您通过 Sitecore 支持 ( http://support.sitecore.net ) 开一张票。此类问题很难通过 Stack Overflow 进行故障排除,因为我们无权访问您的日志和配置。

打开工单时,我建议使用支持包生成器,它捆绑了 Sitecore 支持解决问题所需的所有信息(Web.config、App_Config 文件、IIS 设置、Sitecore 日志文件)。这是一个非常漂亮的工具。

也就是说,根据您的描述,听起来问题与缓存有关。重新启动 IIS 解决问题的事实表明该项目位于 Web 数据库中,但运行时看不到它。您可以通过使用 /sitecore/admin/cache.aspx 屏幕清除缓存来证明这是否是问题所在。如果您的缓存没有正确更新,您应该根据 SDN Scaling Guide中的指南检查您的配置。

于 2012-11-19T18:04:54.157 回答
2

基于知道您正在使用高级数据库爬虫,您的问题可能是您如何将 a 转换SkinnyItemItem. 我以前遇到过这个问题。如果您查看SkinnyItem.cs 类,有一种GetItem()方法可以将其转换为Item. 您可以看到它使用数据库通过 ID、语言和版本号来获取项目。当您从 master 发布到 web 时,您可能正在发布现有项目的新版本,因此新版本存在于 web 数据库中,但索引未更新并引用旧版本。因此,此GetItem()调用将使用以前的版本 # 并且该项目将为空。解决此问题的一种方法是不调用该GetItem()方法,只需使用您自己的代码从 Sitecore 获取该项目的最新版本,例如

Item item = Sitecore.Context.Database.GetItem(someSkinnyItem.ItemID);

代替

Item item = someSkinnyItem.GetItem();

这是一个示例流程:

  • 在主数据库中创建的 Foo 项目作为版本 1。
  • 将 Foo 发布到网络
  • 索引将在 web 数据库中获取版本 1 并放入索引。
  • 任何针对索引的查询代码都将通过该方法将 转换SkinnyItem为一个,并将 1 作为版本号传递。ItemGetItem()
  • 页面将加载,日志中没有错误
  • 回到 master,创建 Foo 的第 2 版并发布。
  • 索引可能不会立即更新,或者即使配置错误。
  • 查找索引的代码将调用GetItem()并且仍然使用版本 1 调用,因为它在索引中
  • 但是当您发布时,web 不再具有版本 1,它现在具有版本 2,因此该项目 Foo 的特定版本为空
  • 错误显示在日志中

与此类似,这里是 Alex Shyba(ADC 的创建者)的博客文章,内容是关于如何将 HTML 缓存清除与索引更新同步。这可能会有所帮助。

于 2012-11-20T18:00:14.030 回答