【问题标题】:Sitecore: Seemingly Random errors appearSitecore:出现看似随机的错误
【发布时间】:2014-01-22 14:06:26
【问题描述】:

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

Assert: Value Cannot be null. Parameter: Item. 

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

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

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

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

【问题讨论】:

  • 我曾经在打开几个浏览器选项卡并在其中使用不同的 Sitecore 数据库时遇到类似的问题,例如从 Sitecore 桌面打开页面编辑器作为新选项卡,然后将桌面切换到 Core 数据库,然后再次尝试在页面编辑器中执行某些操作(无需将桌面切换回 Master 数据库)。
  • 这种情况发生在 web 或 master 数据库中,内容作者或最终用户是否经历过?另外,您有关于缺少什么物品的任何信息吗?
  • 索引总是有些陈旧,因此在根据索引条目拉取 Sitecore 项目时,请确保该项目存在。我已经看到这种情况发生,尤其是在删除项目和发布项目的父项的某种组合时,反之亦然。
  • 您是否使用高级数据库爬虫进行 Lucene 查询?
  • @MarkUrsino 是的,实际上我是,但在出现错误时我没有查询它......

标签: sitecore sitecore6


【解决方案1】:

您描述的是系统稳定性问题,因此我建议您通过 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 中的指南检查您的配置。

【讨论】:

  • 我现在已经向 sitecore 开了一张支持票,正在等待看看会发生什么
  • 酷!让我们知道问题出在哪里。
  • 我也遇到类似问题,网站不稳定。我们也在使用 Sitecore 扩展环境,并且只有通过 IISreset/App 池回收解决的问题。如果您有任何更新,请告诉我们。
  • 迟到总比没有好:令人尴尬的是,我的代码中有一个“新数据库”,它在 Web 服务中运行。导致 Sitecore 重新启动并重新索引项目。然后有时会连续发生多次,导致我描述的问题
【解决方案2】:

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

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

而不是

Item item = someSkinnyItem.GetItem();

这是一个示例流程:

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

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

【讨论】:

  • +1 非常有用的东西,马克,谢谢!我想知道的一件事-为什么执行 IIS 或应用程序池回收可以解决问题?索引不会仍然过时吗?
  • 好问题,它可能不是索引,这只是我的怀疑。您的代码中的静态类成员中是否有任何ItemSkinnyItem 引用?如果是这样,静态成员会在所有页面中保留在内存中,并且不会在页面之间进行处理,因此 IIS 重置/回收将从内存中刷新它
  • 我正在使用sitecore方式获取物品。 foreach (SkinnyItem si in itms) { Item i = Sitecore.Context.Database.GetItem(si.ItemID, LanguageManager.GetLanguage("da")); if (i != null) { resItems.Add(new CarSortingHelper(i)); } }
猜你喜欢
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多