Sitecore GetItem returns 为不同站点检索项目时为空

Sitecore GetItem returns null when retrieving items for different sites

我们在我们的项目中使用 Sitecore 8,它有两个不同的站点。

尝试检索这些站点之一的主页项目时,它似乎不可靠:

var database = Factory.GetDatabase("Web");
var homeItem = database.GetItem(new ID("{FAF3904C-4BE4-ED80-891A-DFEE0A4C18C5}"));

当站点刚在IIS中重启,或者当Sitecore缓存被清空时,有时homeItem变量为null。

似乎数据库对象确实为一个站点("current" 站点,对应于我们的请求 URL)提供了项目,但它没有为另一个站点提供项目。

在对其他站点的后续请求中,两个站点的项目似乎都可用。有时,即使在重新启动 IIS 或清除 Sitecore 缓存后,所有项目从一开始就可用。 (我还没有找到可以一致重现问题的步骤。)

我猜测某处(可能在 Sitecore 缓存之外)正在发生某种缓存,但我不知道它到底是什么。

有人知道为什么 database.GetItem 有时可以 return null 确实存在但可能属于与当前站点不同的站点的项目吗?更重要的是:如何从数据库中获取项目并保证所有站点的项目都可用?

简答:

原来这跟安全有关。当前请求的用户无权访问其他站点的项目。

更多信息:

我在早期测试中使用 SecurityDisabler 时没有立即发现它的原因是我们的项目正在使用自定义 AuthorizationProvider,它显然没有与 SecurityDisabler 正确配合。

此外,目前还不清楚为什么我们确实可以访问第二个站点的后续请求中的所有项目,但我认为这可能与缓存在某种程度上有关。