0

好吧,伙计们,这个真的很奇怪:在为我的 Web 数据库重建 Lucene 索引时,我的 Sitecore 实例 (6.4.1) 正在打盹。查看日志文件,在索引重建开始之前,一切都很顺利,然后日志中充满了 MEGABYTES 的以下堆栈跟踪,一遍又一遍地重复:

ManagedPoolThread #6 15:57:06 ERROR Failed to sort items
Exception: System.IO.FileNotFoundException
Message: Could not load file or assembly 'file:///[OTHER PROJECT LIBRARY].dll' or one of its dependencies. The system cannot find the file specified.
Source: mscorlib
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
    at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
    at System.Reflection.Assembly.LoadFrom(String assemblyFile)
    at Sitecore.Reflection.ReflectionUtil.LoadAssembly(String name)
    at Sitecore.Reflection.ReflectionUtil.CreateObject(String assembly, String className, Object[] parameters)
    at Sitecore.Reflection.ReflectionUtil.CreateObject(String typeName, Object[] parameters)
    at Sitecore.Data.Comparers.ComparerFactory.GetComparer(String sortingId, Database database)
    at Sitecore.Data.Comparers.ComparerFactory.GetComparer(Item item)
    at Sitecore.Configuration.Factory.GetItemComparer(Item item)
    at Sitecore.Data.Managers.ItemProvider.Sort(ItemList items, Item owner)

([OTHER PROJECT LIBRARY].dll 为保护隐私而被缩短,但它是该项目的 sitecore/website/bin 目录的完整路径)

真正奇怪的是,在解决方案或整个文件树(项目和网站文件夹)中都没有以任何方式、形状或形式引用此 DLL。

但关键是:这个 DLL 甚至不是来自同一个项目,它来自我在我的工作站上的另一个项目(它与这个项目一起在它自己的 Sitecore 实例中运行)。

这怎么可能发生?项目 A 试图从项目 B 中引用一个 DLL,而这个 DLL 没有以任何方式被引用。我什至检查了我数据库中的 EventQueue 表......我真的开始失去理智了。

4

2 回答 2

4

查看附加的堆栈跟踪,您会发现问题在于 Sitecore 在对某些项目进行排序时尝试找到合适的比较器。看起来您的一项项目的“类型”字段设置为来自某个外部库的类名。也许有人从剪贴板粘贴了一些错误的类名并且没有注意到它?

尝试执行此查询以查找字段值设置错误的 Item 的名称和 id 以及字段的值:

SELECT 
    ii.Name, ii.ID, f.Value 
FROM 
    [Sitecore_Master].[dbo].[SharedFields] f,
    [Sitecore_Master].[dbo].[Items] i,
    [Sitecore_Web].[dbo].[Items] ii
WHERE f.FieldId = i.ID 
    AND i.Name = 'Type'
    AND ii.ID = f.ItemId
    AND f.Value LIKE '%[OTHER ASSSEMBLY NAME WITHOUT DLL].%'

将数据库的名称更改为您的数据库并使用日志中显示的程序集的名称。您也可以在没有AND i.Name = 'Type'行的情况下尝试使用其他数据库进行此查询。

另一种方法是重写ItemProvider类,如下所示:

namespace My.Namespace
{
    public class MyItemProvider : Sitecore.Data.Managers.ItemProvider
    {
        protected override void Sort(Sitecore.Collections.ItemList items, Sitecore.Data.Items.Item owner)
        {
            try
            {
                base.Sort(items, owner);
            }
            catch (System.Exception exc)
            {
                Sitecore.Diagnostics.Log.Error("Exception while sorting children of " + owner.Paths.FullPath, exc, this);
            }
        }
    }
}

并更改您的sitecore.config文件:

<itemManager defaultProvider="default">
    <providers>
        <clear/>
        <add name="default" type="My.Namespace.MyItemProvider, My.Assembly"/>
    </providers>
</itemManager>

您现在应该在日志中看到导致问题的项目。

于 2013-01-23T22:13:36.380 回答
0

查看您的配置文件,看看您是否可以找到对这个神秘 DLL 的引用。

提示:浏览到 /sitecore/admin/showconfig.aspx 以查看来自主 web.config 的完整配置设置以及所有包含配置文件。我的预感是有一些自定义处理程序引用了索引重建后触发的 DLL

于 2013-01-24T04:41:25.500 回答