我们在我们的项目中使用Sitecore 8,该项目具有两个不同的站点。
当尝试检索这些站点之一的主页项时,似乎不可靠:
var database = Factory.GetDatabase("Web");
var homeItem = database.GetItem(new ID("{FAF3904C-4BE4-ED80-891A-DFEE0A4C18C5}"));
当站点刚刚在IIS中重新启动时,或者当Sitecore缓存被清空时,有时homeItem变量为null。
似乎数据库对象确实为一个站点(“当前”站点,与我们的请求URL对应)提供了项目,但没有为另一站点提供项目。
在对另一个站点的后续请求中,两个站点的项目似乎都可用。有时,即使在重新启动IIS或清除Sitecore缓存之后,从一开始就可以使用所有项目。 (我还没有找到一些步骤可以始终如一地重现该问题。)
我猜测某个地方(可能在Sitecore缓存之外)正在发生某种缓存,但是我不知道它到底是什么。
有人知道为什么database.GetItem有时对于确实存在但可能与当前站点不在同一个站点的项返回null吗?更重要的是:如何确保数据库中的所有项目均可用,如何从数据库中获取项目?
答案 0 :(得分:0)
简短答案:
事实证明,这与安全性有关。当前请求的用户无权访问另一个站点的项目。
更多信息:
在早期测试中使用SecurityDisabler时,我没有立即发现此问题的原因是,我们的项目使用的是自定义的AuthorizationProvider,这显然与SecurityDisabler无法正常配合。
此外,仍然不清楚为什么我们确实有权访问第二个站点的后续请求中的所有项目,但是我认为这可能与某种程度上的缓存有关。