Sitecore:看似随机错误出现

时间:2012-11-19 11:39:11

标签: sitecore sitecore6

我们在安装中遇到了一些非常奇怪的错误。 有时无处Sitecore会抛出错误:

Assert: Value Cannot be null. Parameter: Item. 

我最接近识别问题的是将其缩小到索引或Web数据库。

无论如何,如果我登录到sitecore,那么Item就会丢失,我可以用3种方式解决它:

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

你们有没有人知道为什么会这样?我们正在运行Sitecore.NET 6.5.0(rev.120706)。任何帮助都将深表感谢。

2 个答案:

答案 0 :(得分:4)

您正在描述系统稳定性问题,因此我建议您使用Sitecore支持(http://support.sitecore.net)打开票证。由于我们无法访问您的日志和配置,因此很难对Stack Overflow进行故障排除。

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

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

答案 1 :(得分:2)

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

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

而不是

Item item = someSkinnyItem.GetItem();

以下是一个示例流程:

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

在类似的说明中,here's a blog post by Alex Shyba(ADC的创建者)介绍了如何将HTML缓存清除与索引更新同步。这可能有所帮助。