我们在安装中遇到了一些非常奇怪的错误。 有时无处Sitecore会抛出错误:
Assert: Value Cannot be null. Parameter: Item.
我最接近识别问题的是将其缩小到索引或Web数据库。
无论如何,如果我登录到sitecore,那么Item就会丢失,我可以用3种方式解决它:
iisreset
你们有没有人知道为什么会这样?我们正在运行Sitecore.NET 6.5.0(rev.120706)。任何帮助都将深表感谢。
答案 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();
以下是一个示例流程:
SkinnyItem
方法将Item
转换为GetItem()
,并将#1作为版本传递。GetItem()
并仍然使用版本1调用,因为它位于索引中在类似的说明中,here's a blog post by Alex Shyba(ADC的创建者)介绍了如何将HTML缓存清除与索引更新同步。这可能有所帮助。