错误:ValueFactory尝试访问此实例的Value属性

时间:2014-11-27 00:28:02

标签: c# orchardcms-1.8

错误

源文件: 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缓存作为修复。这些都不适合我们。

我们的解决方法

  1. 删除App_Data
  2. 从所有位置删除模块。
  3. 重新创建网站。
  4. 恢复数据库。
  5. 从Visual Studio的程序包管理器安装模块。
  6. 后验

    似乎解决方法中最重要的部分是删除App_Data。 App_Data内部导致错误的是什么?我们之前尝试删除cache.dat文件但没有成功。我们可以删除App_Data中的其他内容吗?

    另见

2 个答案:

答案 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 threadOrchardLog4netLogger.cs替换

_shellSettings = new Lazy<ShellSettings>(LoadSettings);

_shellSettings = new Lazy<ShellSettings>(LoadSettings,
     System.Threading.LazyThreadSafetyMode.PublicationOnly);

在GitHub讨论中,我们正在等待Orchard团队确认,自下一版本以来,它将成为框架核心的一部分。无论如何,其他几个人证实它有效。

答案 1 :(得分:0)

在对Orchard错误进行排查时,有助于缩小错误的位置:

  1. App_Data文件
  2. 源代码和/或
  3. 数据库即可。
  4. 删除App_Data文件夹并将源代码和数据库重置/恢复到事情正常的时间。如果你一次可以做这些,那将有助于隔离错误 位置。

    在我们的案例中,问题出在 App_Data