Sitecore实例需要来自其他项目的DLL ......?

时间:2013-01-23 21:12:19

标签: c# reflection lucene sitecore sitecore6

好的家伙和女孩们,这个真的很奇怪:当我为我的网络数据库重建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表...我真的开始在这里迷失方向。

2 个答案:

答案 0 :(得分:4)

查看附加的堆栈跟踪,您可以看到问题是Sitecore在排序某些项目时尝试找到合适的比较器。看起来您的某个项目的“Type”字段已设置为某个外部库中的类名。也许有人从剪贴板上粘贴了一些错误的类名并没有注意到它?

尝试执行此查询以查找具有错误字段值集的项目的名称和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>

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

答案 1 :(得分:0)

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

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