源文件: c:\ Projects \ WaterfrontSeattle.org \ src \ Orchard \ Logging \ OrchardLog4netLogger.cs
行: 63
来源错误:
Line 61: // Load the log4net thread with additional properties if they are available
Line 62: protected internal void AddExtendedThreadInfo() {
Line 63: if (_shellSettings.Value != null) {
Line 64: ThreadContext.Properties["Tenant"] = _shellSettings.Value.Name;
Line 65: }
来自DuckDuckGoing,这是我们所学到的,当我们尝试访问Lazy Value 时会发生这种类型的错误。 Codeplex上的一些Orchard论坛帖子表明这意味着该模块已过时,需要更新才能运行。一些Orchard Gallery帖子建议清除Orchard缓存作为修复。这些都不适合我们。
似乎解决方法中最重要的部分是删除App_Data。 App_Data内部导致错误的是什么?我们之前尝试删除cache.dat文件但没有成功。我们可以删除App_Data中的其他内容吗?
答案 0 :(得分:1)
documentation只是一种解决方法。 OP's solution中已经很好地解释了这个问题:
如果任何租户的外壳投入创作(在
DefaultOrchardHost.CreateAndActivateShells()
),例外是 应该使用OrchardLog4netLogger
进行记录。但是,记录 方法还尝试记录当前的shell名称,这是通过获取的 无法初始化,有效强制的ShellSettings
相同 它重新初始化。这导致递归,结束于InvalidOperationException:
ValueFactory attempted to access the
Value
由于property of this instance.
延迟初始化导致ShellSettings
调用自己的Lazy<>.Value
方法。这有两个影响。首先,它 隐藏原始异常,用它覆盖InvalidOperationException
,这使得潜在问题更难 调试。第二,因为Lazy<>.CreateValue()
上引发的例外情况 在每次调用时都会被缓存并重新抛出,这就是租户 在Orchard重新启动之前无法使用。
这已由多个人解决,包括its GitHub issue thread:OrchardLog4netLogger.cs
替换
_shellSettings = new Lazy<ShellSettings>(LoadSettings);
与
_shellSettings = new Lazy<ShellSettings>(LoadSettings,
System.Threading.LazyThreadSafetyMode.PublicationOnly);
在GitHub讨论中,我们正在等待Orchard团队确认,自下一版本以来,它将成为框架核心的一部分。无论如何,其他几个人证实它有效。
答案 1 :(得分:0)
在对Orchard错误进行排查时,有助于缩小错误的位置:
删除App_Data文件夹并将源代码和数据库重置/恢复到事情正常的时间。如果你一次可以做这些,那将有助于隔离错误 位置。
在我们的案例中,问题出在 App_Data 。